`

Spring注解方式管理事务与传播行为

 
阅读更多
@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 {
}
分享到:
评论

相关推荐

    spring2.5学习PPT 传智博客

    使用Spring注解方式管理事务与传播行为详解 24.使用Spring配置文件实现事务管理 25.搭建和配置Spring与Hibernate整合的环境 26.Spring集成的Hibernate编码与测试 27.Struts与Spring集成方案1(Struts集成Spring) ...

    Spring 事务隔离与事务传播的详解与对比

    Spring 事务隔离与事务传播的详解与对比 Spring是SSH中的管理员,负责管理其它框架,协调各个部分的工作。今天一起学习一下Spring的事务管理。Spring的事务管理分为声明式跟编程式。声明式就是在Spring的配置文件中...

    深入理解Spring声明式事务:源码分析与应用实践

    此外,Spring事务管理器支持多种类型的事务策略,包括不同的传播行为和隔离级别,允许开发者根据具体业务场景选择最合适的事务管理策略。深入理解Spring声明式事务的工作原理,不仅能帮助开发者更高效地使用Spring...

    编程语言+JAVAspring+事务管理+数据一致性

    它介绍了JAVAspring的事务管理的概念、原理和作用,以及如何使用JAVAspring的事务管理来保证数据的一致性,包括事务的属性、传播行为、隔离级别、回滚规则等内容,以及一些配置文件和注解的用法。

    尚硅谷佟刚Spring4代码及PPT.rar

    JdbcDaoSupport、使用 NamedParameterJdbcTemplate、Spring 的声明式事务、事务的属性(传播行为、隔离级别、回滚属性、只读属性、过期时间)、使用 XML 文件的方式配置事务、整合 Hibernate、整合 Struts2 等。

    Spring + Hibernate + Struts 事务配置小例子(带提示框等小技巧)

    -- 下面定义事务传播属性 [ bus* 事务的方法名]--&gt; *"&gt;PROPAGATION_REQUIRED &lt;!-- 定义BeanNameAutoProxyCreator,该bean是个bean后处理器,无需被引用,因此没有id属性--&gt; class="org.spring...

    02-01-10-Spring事务传播原理及数据库事务操作原理1

    介绍下,注解方式为例子配置文件开启注解驱动,在相关的类和方法上通过注解@Transactional 标识。Spring 在启动的时候会去解析生成相关的 bean

    高级开发spring面试题和答案.pdf

    AOP实现方式:aop注解或者xml配置;后来工具jar包aspects; aop的属性 事务 事务编码方式: 事务注意事项; 为什么同一个类A调用b方法事务,A方法一定要有事务(编码式的不用) @transaction多个数据源事务怎么指定...

    spring.doc

    5.1.8.2Spring事务的传播属性 117 5.1.8.3Spring事务的隔离级别 117 拓展: 118 5.1.8.4以XML配置的 形式 119 拓展: 120 5.1.8.5以注解方式配置 125 拓展: 127 5.1.9使用CGLIB以XML形式配置事务 130 5.2 Spring+...

    Spring.html

    传播行为:A--&gt;B,在B上声明是否一定需要事务管理 requerd:必须的(默认),如果A有事务那么就加入A的事务,如果A没有事务那么单独创建一个事务 supports,如果A有事务则加入,如果没有就算了 隔离级别 default:...

    Spring.3.x企业应用开发实战(完整版).part2

    10.3.1 Spring事务传播机制回顾 10.3.2 相互嵌套的服务方法 10.4 多线程的困惑 10.4.1 Spring通过单实例化Bean简化多线程问题 10.4.2 启动独立线程调用事务方法 10.5 联合军种作战的混乱 10.5.1 Spring事务管理器的...

    Spring中文帮助文档

    9.5.7. 事务传播 9.5.8. 通知事务操作 9.5.9. 结合AspectJ使用 @Transactional 9.6. 编程式事务管理 9.6.1. 使用TransactionTemplate 9.6.2. 使用PlatformTransactionManager 9.7. 选择编程式事务管理还是声明...

    Spring API

    9.5.7. 事务传播 9.5.8. 通知事务操作 9.5.9. 结合AspectJ使用 @Transactional 9.6. 编程式事务管理 9.6.1. 使用TransactionTemplate 9.6.2. 使用PlatformTransactionManager 9.7. 选择编程式事务管理还是声明...

    Spring学习笔记1

    声明式事务控制Spring提供对事务的控制管注解方式事务属性事务传播为如果当前方法有事务,当前方法事务会挂起,在为加入的方法开启一个新的事务,直到新的事务执完、

    Spring攻略(第二版 中文高清版).part1

    13.6 管理集成测试中的事务 530 13.6.1 问题 530 13.6.2 解决方案 530 13.6.3 工作原理 531 13.7 在集成测试中访问数据库 536 13.7.1 问题 536 13.7.2 解决方案 536 13.7.3 工作原理 537 13.8 使用...

    Spring3.x企业应用开发实战(完整版) part1

    10.3.1 Spring事务传播机制回顾 10.3.2 相互嵌套的服务方法 10.4 多线程的困惑 10.4.1 Spring通过单实例化Bean简化多线程问题 10.4.2 启动独立线程调用事务方法 10.5 联合军种作战的混乱 10.5.1 Spring事务管理器的...

    test-transactional:关于spring中@Transactional注解传播属性原理的实验

    关于spring中@Transactional注解传播属性原理的实验 具体方法: 主体形式:a方法调用b方法 a插入数据“one” b插入数据“two” a、b方法都可以有不同的传播级别或者不加事务注解(none): required(rd), required_...

    springTransaction.rar

    里面为一个演示spring事务传播机制的小demo。简单实现转账功能,通过添加注解调整传播级别,同时通过日志打印查看sql是否执行,在mysql中的数据是否发生了变化(操作提交还是回滚了)。

    Spring攻略(第二版 中文高清版).part2

    13.6 管理集成测试中的事务 530 13.6.1 问题 530 13.6.2 解决方案 530 13.6.3 工作原理 531 13.7 在集成测试中访问数据库 536 13.7.1 问题 536 13.7.2 解决方案 536 13.7.3 工作原理 537 13.8 使用...

Global site tag (gtag.js) - Google Analytics