1. Spring —— tx 声明式事务的框架
对AOP的再次封装,无需编写增强类,只需编写配置文件,声明事务即可
由程序员编写配置文件即可(注解,xml),指定哪些方法需要添加事务和事物的属性即可
概括:存放了事务具体的实现代码 - > 把它交给 - > spring-tx - > 根据它的实现进行事物操作。
2.事务装配
todo:在配置类中设置
1.需要装配事务管理实现对象(插拔式)
2.开启事务:@EnableTransactionManagement // 开启事务注解的支持
//装配事务管理实现对象
@Bean //事务方法声明
public TransactionManager transactionManager(DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}
3.事务方法声明:@Transactional
添加事务:@Transactional
位置:方法 | 类上
方法:当前方法有事务
类上:类下所有的方法有事务
注:以方法为准,方法上的属性设置会覆盖类上的属性设置,注意默认属性
4.事务属性
todo:1.事务属性:只读模式
事务的只读模式默认 false,即非只读模式
但**对不做修改的代码**,如查询代码,
局部可以修改为只读模式覆盖非只读模式
只读模式可以提高查询事务的效率
@Transactional(readOnly = true)
2.事务属性:超时时间
默认:永远不超时 -1
设置:timeout = 时间 秒数 @Transactional(readOnly = true ,timeout = 3)
超过时间,就会回滚事务和释放异常 TransactionTimedOutException: Transaction timed out
3.事务属性:事务异常
默认:指定发生运行时异常,事务才会回滚(发生异常,恢复到上一步)
指定异常回滚:指定Exception异常来控制所有事务都回滚
最好开始就指定:@Transactional(rollbackFor = Exception.class)捕获异常范围
指定异常不回滚:控制某个异常不发生回滚,在回滚异常范围内
一般不设置:@Transactional(rollbackFor = Exception.class,noRollbackFor = FileNotFoundException.class)
发生FileNotFoundException异常时不回滚事务
4.事务属性:事务隔离级别
概念:多个事务并发时,DBS为保证数据一致性所遵守的规定
常见隔离级别(低——>高):读未提交、读已提交、可重复读、串行化
推荐设置:读已提交(性能最好) @Transactional(@isolation)
5.事务属性:事务传播行为
概念:多个事务之间在传播调用时,各事务之间的影响程度,子事务是否加到了父事务
事务传播行为的属性设置到子事务方法上
对两个类而言才生效,同一个类中不生效,因为两个类,才会生成代理对象
5.1 @Transactional(propagation = Propagation.REQUIRED)
该属性值是默认值,推荐使用
5.1.1 如果父方法有事务,就加入到父方法的事务中,最终是同一个事务,
当一个子事务异常时,父事务中的其他子事务都回滚
5.1.2 如果父方法没有事务,就新建为独立事务,无传播性
5.2 @Transactional(propagation = Propagation.REQUIRES_NEW)
声明此子事务是独立事务,无传播性,不管父方法是否有事务