2026/4/18 7:27:36
网站建设
项目流程
自己怎么做电影网站可以赚钱吗,如何建设网站app,为什么wordpress模板,广告公司简介范文大全在Spring Boot大行其道的时代#xff0c;开发者可以通过Transactional注解来方便的操作事务
隔离级别
Transactional注解的isolation属性#xff0c;可用来设置隔离级别。默认值为Isolation.DEFAULT。该属性可选值有#xff1a;
Isolation.DEFAULT#xff1a;数据源默认…在Spring Boot大行其道的时代开发者可以通过Transactional注解来方便的操作事务隔离级别Transactional注解的isolation属性可用来设置隔离级别。默认值为Isolation.DEFAULT。该属性可选值有Isolation.DEFAULT数据源默认隔离级别Isolation.READ_UNCOMMITTED未提交读Isolation.READ_COMMITTED已提交读Isolation.REPEATABLE_READ可重复读Isolation.SERIALIZABLE串行化回滚条件Transactional注解默认只会对RuntimeException、Error及其子类进行回滚。如果期望对检查异常进行回滚可通过rollbackFor、rollbackForClassName属性添加新的回滚条件// 方式1: 支持对所有异常类型进行回滚 Transactional(rollbackFor Exception.class) // 方式2支持对所有异常类型进行回滚 Transactional(rollbackForClassName {Exception})类似地还可以排除某些异常使之不发生回滚// 方式1: 抛出ArithmeticException异常不进行回滚 Transactional(noRollbackForClassName {ArithmeticException} ) // 方式2: 抛出ArithmeticException异常不进行回滚 Transactional(noRollbackFor {ArithmeticException.class} )上述四种回滚条件的属性对指定异常的子类也是生效的只读事务Transactional注解的readOnly属性默认为false如需只读事务可将其配置为true。在只读事务中不允许执行读之外操作否则事务将会回滚事务传播行为Transactional注解的propagation属性可用来设置事务传播行为默认值为Propagation.REQUIRED。其用来表示当一个事务传播行为修饰的方法(即methodB)被另一个方法(即methodA)调用时事务如何进行传播public class ServiceA { public void methodA() { ... serviceB.methodB(); ... } } ... public class ServiceB { // 通过propagation属性指定methodB方法的事务传播行为 Transactional(propagation ...) public void methodB() { ... } }Propagation.REQUIRED支持当前事务如果当前没有事务则新建一个事务。如下图所示。这也是日常开发中最常使用的配置。在Case 1的场景下无论methodA方法还是methodB方法出现异常均会进行回滚因为它们是在同一个事务中Propagation.REQUIRES_NEW新建事务如果当前存在事务则把当前事务挂起。如下图所示。以Case 1为例进行分析由于methodA、methodB方法使用的是两个不同的事务故当methodB方法提交后即使methodA方法失败回滚了也不会导致methodB方法出现回滚。当methodB方法失败回滚后如果methodA未捕获methodB所抛出的异常导致methodA继续抛出该异常则methodA方法也会被回滚如果methodA方法捕获methodB所抛出的异常则methodA所在的事务还是有可能提交成功的Propagation.SUPPORTS支持当前事务否则将非事务方式执行。如下图所示Propagation.MANDATORY支持当前事务否则将抛出IllegalTransactionStateException异常此时不仅methodB方法无法得到执行也会打断methodA方法的执行流程除非在methodA方法中捕获处理该异常。如下图所示Propagation.NOT_SUPPORTED不支持当前事务而是始终以非事务的方式执行。如下图所示Propagation.NEVER以非事务方式执行如果当前存在事务则抛出IllegalTransactionStateException异常此时不仅methodB方法无法得到执行还会打断methodA方法的执行流程甚至导致methodA方法发生回滚Propagation.NESTED如果当前存在事务则对于该传播行为修饰的方法会依然使用当前事务这样一旦methodA方法进行回滚则methodB方法也会进行回滚。但由于该传播行为是通过数据库事务的保存点进行实现的那么一旦methodB方法抛出异常发生回滚。如果methodA方法捕获了methodB方法所抛出的异常则methodA就不会因此而回滚而methodA方法如果继续向上抛出异常则其也会被回滚如果当前没有事务则新建一个事务。如下图所示Note事务注解只会对public方法生效当Transactional事务注解添加在类上表示其将作用于该类中的所有public方法通过类内部调用事务方法事务无法生效例如下面代码所示在A类内部通过一个普通方法methodA调用事务方法methodB那么methodB的事务会生效么public class A { public void methodA() { ... methodB(); ... } Transactional public void methodB() { ... } }答案是否原因很简单。这里我们将Spring AOP后的动态代理类ProxyA用伪代码的形式给出如下所示。可以看到虽然动态代理类ProxyA中的methodB方法被加入了事务切面。但事实上调用ProxyA的methodA方法后会直接进入目标类A中即执行a.methodA()方法然后直接调用A类中的methodB方法。换言之methodB方法没有通过代理类ProxyA进行调用自然其事务注解不会生效public class ProxyA { private A a new A(); public void methodA() { // 执行目标方法 a.methodA(); } public void methodB() { // 前置增强 ... // 执行目标方法 a.methodB(); // 后置增强 ... } }即使在A类的methodA上也添加Transactional事务注解methodB方法由于没走代理类ProxyA故methodB方法依然还是使用methodA方法的事务。即使将methodB方法的传播行为设置为Propagation.REQUIRES_NEW也不会重新开启一个新的事务。因为methodB方法连Transactional注解都无法生效设置传播行为更是无任何意义