Spring在TransactionDefinition接口中规定了7种类型的事务传播行为。事务传播行为是Spring框架独有的事务特性。
一、事务传播属性
- PROPAGATION_REQUIRED --支持当前事务,如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
情况一:########################################## @Service public class UserService{ @Autowired private UserDao userDao; @Autowired private LogService logService; @Transaction(propagation = Propagation.required) public void addUser(User user){ //1、执行添加用户的操作 userDao.addUser(user); //2、执行插入日志的操作 logService.addLog(); } } @Service public class LogService{ @Autowired LogDao logDao; public void addLog(Log log){ //3、执行第一次插入日志的操作 logDao.addLog(log); int num = 100/0; //会报异常 //4、执行第二次插入日志的操作 logDao.addLog(log) } } 情况二:########################################## @Service public class UserService{ @Autowired private UserDao userDao; @Autowired private LogService logService; public void addUser(User user){ //1、执行添加用户的操作 userDao.addUser(user); //2、执行插入日志的操作 logService.addLog(); } } @Service public class LogService{ @Autowired LogDao logDao; @Transaction(propagation = Propagation.required) public void addLog(Log log){ //3、执行第一次插入日志的操作 logDao.addLog(log); int num = 100/0; //会报异常 //4、执行第二次插入日志的操作 logDao.addLog(log) } }
情况一:被调用者(LogService.addLog())方法并未添加事务注解,但调用者(UserService.addUser())添加了事务注解且隔离级别是“required”,则事务生效,执行第一次插入日志的操作,报异常,这出现回滚操作,添加用户的操作和第一次日志操作都会进行回滚。情况二:被调用者(LogService.addLog())方法添加事务注解且隔离级别是“required”,调用者(UserService.addUser())并未添加事务注解,执行添加用户的操作之后,调用LogService.addLog()方法时生成一个事务,但执行第一次插入日志操作后报出异常,所以用户表中数据不会回滚,第一次执行插入日志操作回滚。
- PROPAGATION_SUPPORTS --支持当前事务,如果当前没有事务,就已非事务方式执行。
- PROPAGATION_MANDATORY --支持当前事务,如果当前没有事务,就抛出异常。
- PROPAGATION_REQUIRES_NEW --新建事务,如果当前存在事务,就把当前事务挂起。
- PROPAGATION_NOT_SUPPORTED --以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
- PROPAGATION_NEVER --以非事务方式执行,如果当前存在事务,则抛出异常。
- PROPAGATION_NESTED --如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与ROPAGATION_REQUIRED类似的操作。