说明: 如果当前已经存在事务,那么加入该事务,如果不存在事务,创建一个事务,这是默认的传播属性值。
@Service public class RequireMethodService { @Autowired UserService userService; @Transactional(propagation = Propagation.REQUIRED) public void methodSon1() { User user = new User(); user.setId(1); user.setUserName("A"); userService.save(user); String act = TransactionSynchronizationManager.getCurrentTransactionName(); System.out.println("Transaction1-----" + act); } @Transactional(propagation = Propagation.REQUIRED) public void methodSon2() { User user = new User(); user.setId(2); user.setUserName("B"); userService.save(user); String act = TransactionSynchronizationManager.getCurrentTransactionName(); System.out.println("Transaction2-----" + act); } }
@Service public class RequireService { @Autowired RequireMethodService requireMethodService; @Transactional public void service() { String act = TransactionSynchronizationManager.getCurrentTransactionName(); System.out.println("begin-----" + act); requireMethodService.methodSon1(); requireMethodService.methodSon2(); } }
执行结果:事务是相同的
begin-----com.cn.service.propagation.require.RequireService.service
Transaction1-----com.cn.service.propagation.require.RequireService.service
Transaction2-----com.cn.service.propagation.require.RequireService.service
如果当前已经存在事务,那么加入该事务,否则创建一个所谓的空事务(可以认为无事务执行)。
@Service public class SupportMethodService { @Autowired UserService userService; @Transactional(propagation = Propagation.SUPPORTS) public void methodSon1() { User user = new User(); user.setId(1); user.setUserName("A"); userService.save(user); throw new RuntimeException("异常"); } }
@Service public class SupportService { @Autowired SupportMethodService supportMethodService; @Transactional public void service() { supportMethodService.methodSon1(); } }
执行结果:
SupportService在调用SupportMethodService的过程中
1. SupportService没有事务,则methodSon1也没有事务,不会回滚,数据插入到数据库。
2. SupportService有事务,则methodSon1加入到事务中,会回滚。
当前必须存在一个事务,否则抛出异常。
@Service public class MandatoryMethodService { @Autowired UserService userService; @Transactional(propagation = Propagation.MANDATORY) public void methodSon1() { User user = new User(); user.setId(1); user.setUserName("A"); userService.save(user); } @Transactional(propagation = Propagation.MANDATORY) public void methodSon2() { User user = new User(); user.setId(2); user.setUserName("B"); userService.save(user); } }
@Service public class MandatoryService { @Autowired MandatoryMethodService mandatoryMethodService; // @Transactional public void service() { //没有事务 mandatoryMethodService.methodSon1(); } }
执行结果:
org.springframework.transaction.IllegalTransactionStateException: No existing transaction found for transaction marked with propagation 'mandatory' at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:362) ~[spring-tx-5.3.6.jar:5.3.6] at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:595) ~[spring-tx-5.3.6.jar:5.3.6] at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:382) ~[spring-tx-5.3.6.jar:5.3.6] at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.6.jar:5.3.6] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.6.jar:5.3.6] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) ~[spring-aop-5.3.6.jar:5.3.6] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) ~[spring-aop-5.3.6.jar:5.3.6]never 必须没有事务
如果当前存在事务,则抛出异常
@Service public class NeverMethodService { @Autowired UserService userService; @Transactional(propagation = Propagation.REQUIRED) public void methodSon1() { User user = new User(); user.setId(1); user.setUserName("A"); userService.save(user); } @Transactional(propagation = Propagation.NEVER) public void methodSon2() { User user = new User(); user.setId(2); user.setUserName("B"); userService.save(user); } }
@Service public class NeverService { @Autowired NeverMethodService neverMethodService; @Transactional public void service() { //methodSon1创建了事务,但不会影响methodSon2 neverMethodService.methodSon1(); //methodSon2此时会报错,因为service()上已经开启了事务 neverMethodService.methodSon2(); } }
执行结果:
org.springframework.transaction.IllegalTransactionStateException: Existing transaction found for transaction marked with propagation 'never' at org.springframework.transaction.support.AbstractPlatformTransactionManager.handleExistingTransaction(AbstractPlatformTransactionManager.java:413) ~[spring-tx-5.3.6.jar:5.3.6] at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:352) ~[spring-tx-5.3.6.jar:5.3.6] at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:595) ~[spring-tx-5.3.6.jar:5.3.6] at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:382) ~[spring-tx-5.3.6.jar:5.3.6] at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.6.jar:5.3.6] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.6.jar:5.3.6] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) ~[spring-aop-5.3.6.jar:5.3.6] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) ~[spring-aop-5.3.6.jar:5.3.6]requires_new新事务
REQUIRES_NEW新建一个事务,不管当前有没有事务,都新建一个独立的事务。
@Service public class RequireNewMethodService { @Autowired UserService userService; @Transactional(propagation = Propagation.REQUIRED) public void methodSon1() { User user = new User(); user.setId(1); user.setUserName("A"); userService.save(user); String act = TransactionSynchronizationManager.getCurrentTransactionName(); System.out.println("Transaction1-----" + act); } @Transactional(propagation = Propagation.REQUIRES_NEW) public void methodSon2() { User user = new User(); user.setId(2); user.setUserName("B"); userService.save(user); String act = TransactionSynchronizationManager.getCurrentTransactionName(); System.out.println("Transaction2-----" + act); } }
@Service public class RequireNewService { @Autowired RequireNewMethodService requireNewMethodService; @Transactional public void service() { String act = TransactionSynchronizationManager.getCurrentTransactionName(); System.out.println("begin-----" + act); requireNewMethodService.methodSon1(); requireNewMethodService.methodSon2(); } }
执行结果:
begin-----com.cn.service.propagation.requiresnew.RequireNewService.service
Transaction1-----com.cn.service.propagation.requiresnew.RequireNewService.service
Transaction2-----com.cn.service.propagation.requiresnew.RequireNewMethodService.methodSon2
1)methodSon2方法内部报错,则只会回滚methodSon2里面的。
2)methodSon2方法内部不报错,但是外面的调用方报错了,则methodSon2会跟着一起回滚。
3)methodSon2方法内部不报错,外面也不报错,则methodSon2和外面事务一起提交。
@Service public class NestedMethodService { @Autowired UserService userService; @Transactional(propagation = Propagation.REQUIRED) public void methodSon1() { User user = new User(); user.setId(1); user.setUserName("A"); userService.save(user); } @Transactional(propagation = Propagation.NESTED) public void methodSon2() { User user = new User(); user.setId(2); user.setUserName("B"); userService.save(user); throw new RuntimeException("methodSon2异常"); } }
@Service public class NestedService { @Autowired NestedMethodService nestedMethodService; @Transactional public void service() { nestedMethodService.methodSon1(); try { nestedMethodService.methodSon2(); } catch (Exception e) { e.printStackTrace(); } } @Transactional public void service2() { try { nestedMethodService.methodSon1(); } catch (Exception e) { e.printStackTrace(); } nestedMethodService.methodSon2(); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)