小言_互联网的博客

Spring事务传播行为

289人阅读  评论(0)

一.什么是事务传播?

前提:

至少具有两个事务,单体不存在传播行为.

事务传播行为(propagation behavior):

是指当一个事务方法被另一个事务方法调用时,这个事务方法该如何运行.

Spring的事务传播行为时Spring框架特有的事务增强特性,不属于数据库行为.

例如:

methodA()方法调用methodB()方法时,methodB()方法是继续在调用者methodA()的事务中运行呢,还是自己开启一个新的事务运行,这就是由methodB()的事务传播行为决定的.

二.事务的7种传播行为

Spring在TransactionDefinition接口中规定了7中类型的事务传播行为,为我们开发提供了许多便利.

传播行为设置格式:

@Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)

以上述为例,我们在设置事务传播行为时可以直接在@Transactional注解中通过propagation属性添加事务传播行为

7种事务传播行为如下:

1.PROPAGATION_REQUIRED(默认)

当一个有事务的方法调用了传播行为设置为REQUIRED的方法,那么被调用的方法就会合并到它的事务中;当一个个没有事务的方法调用了传播行为设置为REQUIRED的方法,那么被调用的方法就会自己开启一个事务.

栗子:

被调用事务:


  
  1. package com.ffyc.springdemo.service;
  2.  ​
  3.   import com.ffyc.springdemo.dao.AdminDao;
  4.   import com.ffyc.springdemo.dao.LogDao;
  5.   import org.springframework.beans.factory.annotation.Autowired;
  6.   import org.springframework.stereotype.Service;
  7.   import org.springframework.transaction.annotation.Propagation;
  8.   import org.springframework.transaction.annotation.Transactional;
  9.  ​
  10.   @Service
  11.   @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
  12.   public class LogService {
  13.  ​
  14.       @Autowired
  15.      LogDao logDao;
  16.  ​
  17.       public void saveLog (){
  18.          logDao.saveLog();
  19.     }
  20.  }
调用者:

  
  1. package com.ffyc.springdemo.service;
  2.  ​
  3.   import com.ffyc.springdemo.dao.AdminDao;
  4.   import com.ffyc.springdemo.dao.LogDao;
  5.   import org.springframework.beans.factory.annotation.Autowired;
  6.   import org.springframework.stereotype.Service;
  7.   import org.springframework.transaction.annotation.Propagation;
  8.  ​
  9.   @Service
  10.   @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
  11.   public class AdminService {
  12.  ​
  13.       @Autowired
  14.      AdminDao adminDao;
  15.  ​
  16.       @Autowired
  17.      LogDao logDao;
  18.  ​
  19.  ​
  20.       public void saveAdmin (){
  21.          logDao.saveLog();
  22.          adminDao.saveAdmin();
  23.     }
  24.  }
 这样我们就在 AdminService 中调用了事务传播行为设置为REQUIRED的事务.

2.SUPPORTS

当一个有事务的方法调用一个传播行为设置为SUPPORTS的方法,那么被调用的方法会合并到当前事务中;当一个没有事务的方法调用一个传播行为设置为SUPPORTS的方法,那么被调用的方法也没有事务

3.REQUIRES_NEW

无论调用的方法中是有事务还是没有事务,传播行为设置为REQUIRES_NEW的方法都会创建一个新的事务

4.PROPAGATION_MANDATORY

支持当前事务,如果当前存在事务,就加入该事务;如果当前不存在事务,就抛出异常

5.PROPAGATION_NOT_SUPPORTED

以非事务方式执行操作,如果当前存在事务,则将当前事务挂起

6.PROPAGATION_NEVER

以非事务方式执行操作,如果当前存在事务,则抛出异常

7.PROPAGATION_NESTED

如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则按照 REQUORED 属性执行


转载:https://blog.csdn.net/weixin_52629592/article/details/128908226
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场