1220-Spring JDBC、事务
JdbcTemplate
创建与使用
原始用法
- 使用c3p0中无参构造创建ComboPooledDatasource获取DataSource对象
- 调用DataSource对象的set方法设置driverclass、username、password、URL
- 使用传入DataSource对象的构造函数,创建jdbcTemplate对象
- 调用jdbcTemplate对象的query/queryforlist/queryforobject方法
工具类抽取
c3p0-config.xml方式
- 配置c3p0-config.xml,其中配置driverclass、username、password、URL
- 使用c3p0中无参构造创建ComboPooledDatasource获取DataSource对象(默认自动读取c3p0-config.xml)
- 使用传入DataSource对象的构造函数,创建jdbcTemplate对象
IOC方式
- 创建spring的xml配置文件(配置注解扫描路径和配置文件读取)
- 使用bean节点创建ComboPooledDatasource对象,使用property节点配置driverclass、username、password、URL
- 使用bean节点创建jdbcTemplate对象,使用property节点配置DataSource参数
- 在dao的实现类中创建jdbcTemplate对象成员变量,使用自动装配;直接调用其方法即可
声明式事务 Spring Transaction
概念
不可分割的工作单位,用户定义的一组绑定的操作序列。
实现原理:AOP
特征
Automicity原子性、Consistancy一致性、Durability永久性、Isolution隔离性
作用
保持业务流程完整性、数据完整准确
方便分布式事务,避免并发问题
提高性能
并发问题与隔离级别
脏读 | 虚读(不可重复读) | 幻读 | |
---|---|---|---|
含义 | 事务A能访问事务B未提交的数据(B随时会改变/发生异常回滚) | 事务A能修改事务B正在读取的数据(两次查询结果值不一致) | 事务A能增删事务B正在读取的数据(两次查询结果数量不一致) |
读未提交 | 发生 | 发生 | 发生 |
读已提交 | 解决 | 发生 | 发生 |
可重复读 | 解决 | 解决 | 发生 |
串行化读 | 解决 | 解决 | 解决 |
Spring中的传播行为
类型 | 字面理解 | 传播行为解释 | 使用场景 |
---|---|---|---|
required | 必须(有一个) | 已有直接用,没有则自动创建后在其中运行 | 增删改常用,默认 |
required_new | 必须用新的 | 无论有没有,自动创建一个事务并在其中运行 | |
supports | 仅仅是支持 | 有就用,没有就直接运行 | 查询行为可用 |
not supported | 不支持用 | 有就挂起,没有就直接运行 | |
never | 决不能用 | 有就报异常 | |
nested | 嵌套 | 支持嵌套式事务 | |
mandatory | 强制 | 有就用,没有就抛异常 |
使用方式
1. 手动编写事务相关代码(了解)
2. 编程式事务(非声明式事务,了解)
xml 方式
bean节点 创建事务管理器
配置class属性为DataSourcetransactionManager,创建实例
配置dataSource属性,绑定当前项目中使用的数据源
tx:advise节点 配置事务
配置transactionManager属性绑定事务管理器
子节点 tx:attributes
子节点 tx:method :配置具体需要添加事务的方法 (包括 name方法名、isolation隔离级别、propagation传播行为 属性)
aop:config 节点 配置事务通知
aop:pointcut 配置需要添加事务的切点
aop:advisor 配置事务切面:绑定切点和事务 advice-ref="事务的id" point-ref="切点的ID")
注解方式
bean节点 创建事务管理器
配置class属性为DataSourcetransactionManager,创建实例
配置dataSource属性,绑定当前项目中使用的数据源
aop:config 节点 配置事务通知
aop:pointcut 配置需要添加事务的切点
tx:annotation-driven节点 打开事务注解开关(声明事务使用注解驱动)
配置transactionManager属性绑定事务管理器
Service层业务逻辑类/具体方法上 使用@Transactional(isolation、propagation)注解声明