一.什么是事务
事务是一种能够保证同一个业务中多个写操作(增删改)要么全部成功,要么全部失败的一种机制
二.添加事务
在业务方法上添加@Transactional注解即可保证该业务是事务性的,即要么业务中的所有写操作要么全部成功,要么全部失败
此注解可以添加在:
接口:
会使得此接口的所有实现方法都是事务性的
接口的抽象方法:
会使得此接口的实现类中,重写的此方法是事务性的
只作用于当前方法
如果接口上也配置了此注解,并且接口和抽象方法的注解均配置了参数,以方法上的配置为准
业务实现类:
会使得当前类中的所有重写的方法都是事务性的
自定义方法不会是事务性的
业务实现类中的方法:
不可以添加在自定义的(不是重写的)方法上---语法上允许,但是执行的时候不允许,SpringJDBC是通过接口代理的方式进行事务管理,所以,只对接口中声明的方法有效
会使得此实现类中,重写的此方法是事务性的
只作用于当前方法
如果实现类上也配置了此注解,并且实现类和方法的注解均配置了参数,以方法上的配置为准
通常,应该将此注解添加在接口的抽象方法上(或者为了避免遗漏,可以添加在接口上)
三.SpringJDBC中处理事务的机制
SpringJDBC中处理事务的机制大致是:
开启事务:Begin
try{
你的业务方法
提交:commit
}catch(RuntimeException e){
回滚:rollback
}
所以,为了保证事务性,所有的写操作在执行之后,必须有某个判定失败的标准,且判定失败后,必须抛出RuntimeException或其子孙类异常
SpringJDBC默认对RuntimeException进行回滚处理,有必要的话,也可以配置为其他异常类型
四.事务传播机制(在注解中的参数部分添加)
当多个事务同时存在的时候,spring如何处理这些事务的行为.事务传播机制实际上是使用简单的ThreadLocal实现的.如果调用的方法是在新线程调用的,事务传播是会失效的.
如何解决失效:可考虑全局事务,否则就加锁处理
7大事务传播机制:
1.Propagation_Required:默认传播行为,如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务.
2.propagation_requires_new:无论当前存不存在事务,都创建新事务进行执行
3.PROPAGATION_SUPPORTS:如果当前存在事务,就加入该事务;如果当前不存在事务,就以非事务执行。
4.PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
5.PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则按REQUIRED属性执行。
6.PROPAGATION_MANDATORY:如果当前存在事务,就加入该事务;如果当前不存在事务,就抛出异常。
7.PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
上述传播机制中,最常用的是Required和requires_new