Spring注解方式管理事务与传播行为
程序员文章站
2022-07-04 23:09:26
...
@Transactional的声明式事务管理
基于<tx>命名空间和基于@Transactional的事务声明方式各有优缺点。基于<tx>的方式,其优点是与切点表达式集合,功能强大。利用切点表达式,一个配置可以匹配多个方法,而基于@Transactional的方式必须在每一个需要使用事务的方法或者类上用@Transactional标注,尽管可能大多数事务的规则是一致的,但是对@Transactional而言它无法重用,必须逐个指定。基于@Transactional的方式使用起来非常简单明了,没有学习成本。
@Transactional可以作用于接口,接口方法,类以及类方法上。当作用于类上时,该类的所有public方法将都具有该类型的事务属性,但是Spring小组建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理是它才会生效。这是Spring AOP的本质决定的,如果在protected,private或者默认可见性的方法上使用@Transactional注解,这将被忽略,也不会抛出任何异常。同时,也可以在方法级别使用该标注来覆盖类级别的定义。
基于<tx>命名空间和基于@Transactional的事务声明方式各有优缺点。基于<tx>的方式,其优点是与切点表达式集合,功能强大。利用切点表达式,一个配置可以匹配多个方法,而基于@Transactional的方式必须在每一个需要使用事务的方法或者类上用@Transactional标注,尽管可能大多数事务的规则是一致的,但是对@Transactional而言它无法重用,必须逐个指定。基于@Transactional的方式使用起来非常简单明了,没有学习成本。
@Transactional可以作用于接口,接口方法,类以及类方法上。当作用于类上时,该类的所有public方法将都具有该类型的事务属性,但是Spring小组建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理是它才会生效。这是Spring AOP的本质决定的,如果在protected,private或者默认可见性的方法上使用@Transactional注解,这将被忽略,也不会抛出任何异常。同时,也可以在方法级别使用该标注来覆盖类级别的定义。
// 业务方法需要在一个事物中运行,如果方法运行时,已经存在一个事物中, // 那么加入该事物,否则为自己创建一个新事物。 @Transactional(propagation = Propagation.REQUIRED) public void test1() { } // 声明方法不需要事务,如果方法没有关联到一个事务,容器不会为它开启事物。 // 如果方法在一个事物中被调用,该事物会被挂起,在方法调用结束后,原先的 // 事物便会恢复执行。 @Transactional(propagation = Propagation.NOT_SUPPORTED) public void test2() { } // 表明不管是否存在事物,业务方法总会为自己发起一个新事物。 // 如果方法已经运行在一个事物中,则原有事物会被挂起, // 新的事物会被创建,直到方法执行结束,新事物才算结束, // 原先的事务才会被恢复执行。 @Transactional(propagation = Propagation.REQUIRES_NEW) public void test3() { } // 该属性指定业务方法只能在一个已经存在的事物中执行, // 业务方法不能发起自己的事物,如果业务方法在没有事物的环境 // 下调用,容器就会抛出异常。 @Transactional(propagation = Propagation.MANDATORY) public void test4() { } // 这个事物属性表明,如果业务方法在某个事务范围内被调用,则方法成为该事物的一部分, // 如果业务方法在事务范围外被调用,则方法在没有事物的环境下执行。 @Transactional(propagation = Propagation.SUPPORTS) public void test5() { } // 指定业务方法绝对不能在事物范围内执行。如果业务方法在某个事物中执行, // 容器会抛出异常,只有业务方法没有关联到任何事物,才能正常执行。 @Transactional(propagation = Propagation.NEVER) public void test6() { } // 如果一个活动的事物存在,则运行在一个嵌套的事物中,如果没有活动事物, // 则按REQUIRED属性执行,它使用了一个单独的事物,这个事物拥有多个回滚的保存点, // 内部事务的回滚不会对外事物造成影响,它只对DataSourceTransactionManager // 事务管理器起效。 @Transactional(propagation = Propagation.NESTED) public void test7() { } @Transactional(isolation = Isolation.DEFAULT) public void test8() { } // 读已提交数据(会出现不可重复读和幻读) @Transactional(isolation = Isolation.READ_COMMITTED) public void test9() { } // 读未提交数据(会出现脏读、不可重复读和幻读) @Transactional(isolation = Isolation.READ_UNCOMMITTED) public void test10() { } // 可重复读(会出现幻读) @Transactional(isolation = Isolation.REPEATABLE_READ) public void test11() { } // 串行化 @Transactional(isolation = Isolation.SERIALIZABLE) public void test12() { } // 抛出Exception异常时,记录回滚 @Transactional(rollbackFor = Exception.class) public void test13() throws Exception { } // 抛出Exception异常时,记录不回滚 @Transactional(noRollbackFor = Exception.class) public void test14() throws Exception { }
上一篇: byte与int互转
下一篇: Mybatis配置文件的标签顺序
推荐阅读
-
spring事务的传播行为与隔离级别(一)
-
Spring注解方式管理事务与传播行为
-
Spring注解方式管理事务与传播行为
-
mysql的4种事务特性,5种隔离级别,7种传播行为/ MySQL InnoDB事务隔离级别脏读、可重复读、幻读/ Spring Boot中的事务管理 隔离级别
-
Spring事务管理实现方式之编程式事务与声明式事务
-
spring,mybatis事务管理配置与@Transactional注解使用
-
spring,mybatis事务管理配置与@Transactional注解使用
-
Spring注解方式管理事务
-
spring事务管理-事务传播与事务隔离
-
Spring事务管理实现方式之编程式事务与声明式事务