下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 Spring事务机制详解Spring事务机制主要包括 声明式事务和编程式事务,此处侧重讲解声明式事务,编程式事务在实际开发中得不到泛使,仅供学习参考。章录Spring事务机制概述Spring声明式事务让我们从复杂的事务处理中得到解脱。使得我们 再也需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。再也需要我们在与事务相关的法中处理量的trycatchfinally代码。我们在使Spring声明式事务时,有个常重要的概念就是事务属性。事务属性通常由事务的传播为,事务的隔离级别,事务的超时值和事务只读标志组成。我们在进事务划分时,需要进事务定义,也就是配置事务的属性。事务的四种属性Spri
2、ng在TransactionDefinition接中定义这些属性,以供PlatfromTransactionManager使, PlatfromTransactionManager是Spring事务管理的核接。public interface TransactionDefinition int getIsolationLevel(); /返回事务的隔离级别,事务管理器根据它来控制另外个事务可以看到本事务内的哪些数据。int getTimeout(); /返回事务必须在多少秒内完成。boolean isReadOnly(); /事务是否只读,事务管理器能够根据这个返回值进优化,确保事务是只读的。
3、TransactionDefinition接中定义了五个隔离级别ISOLATION_DEFAULT 这是个PlatfromTransactionManager默认的隔离级别,使数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应;ISOLATION_READ_UNCOMMITTED 这是事务最低的隔离级别,它充许别外个事务可以看到这个事务未提交的数据。这种隔离级别会产脏读,不可重复读和幻像读。ISOLATION_READ_COMMITTED 保证个事务修改的数据提交后才能被另外个事务读取。另外个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和
4、幻像读。ISOLATION_REPEATABLE_READ 这种事务隔离级别可以防脏读,不可重复读。但是可能出现幻像读。它除了保证个事务不能读取另个事务未提交的数据外,还保证了避免下的情况产(不可重复读)。ISOLATION_SERIALIZABLE 这是花费最代价但是最可靠的事务隔离级别。事务被处理为顺序执。除了防脏读,不可重复读外,还避免了幻像读。TransactionDefinition接中定义了七个事务传播为(1)PROPAGATION_REQUIRED 如果存在个事务,则持当前事务。如果没有事务则开启个新的事务。 / 事务属性PROPAGATION_REQUIRED/ 事务属性PRO
5、PAGATION_REQUIRED使Spring声明式事务,spring使AOP来持声明式事务,会根据事务属性,动在法调之前决定是否开启个事务,并在法执之后决定事务提交或回滚事务。单独调methodB法:con = getConnection();con.setAutoCommit(false);/法调methodB();/提交事务mit(); Catch(RuntimeException ex) /回滚事务/释放资源closeCon();Spring保证在methodB法中所有的调都获得到个相同的连接。在调methodB时,没有个存在的事务,所以获得个新的连接,开启了个新的事务。单独调Met
6、hodA时,在MethodA内会调MethodB。执效果相当于:Main Connection con = null;try con = getConnection();methodA();mit(); catch(RuntimeException ex) con.rollback(); finally closeCon();调MethodA时,环境中没有事务,所以开启个新的事务.当在MethodA中调MethodB时,环境中已经有了个事务,所以methodB就加当前事务。 (2)PROPAGATION_SUPPORTS 如果存在个事务,持当前事务。如果没有事务,则事务的执。但是对于事务同步的
7、事务管理器,PROPAGATION_SUPPORTS与不使事务有少许不同。/ 事务属性PROPAGATION_REQUIRED/ 事务属性PROPAGATION_SUPPORTS单纯的调methodB时,methodB法是事务的执的。当调methdA时,methodB则加了methodA的事务中执。(3)PROPAGATION_MANDATORY 如果已经存在个事务,持当前事务。如果没有个活动的事务,则抛出异常。/ 事务属性PROPAGATION_REQUIRED/事务属性PROPAGATION_MANDATORY当单独调methodB时,因为当前没有个活动的事务,则会抛出异常throw ne
8、w IllegalTransactionStateException(“Transactionpropagation mandatory but no existing transaction found”); 当调methodA时,methodB则加到methodA的事务中执。(4)PROPAGATION_REQUIRES_NEW 总是开启个新的事务。如果个事务已经存在,则将这个存在的事务挂起。/事务属性PROPAGATION_REQUIREDmethodA() doSomeThingA();methodB();doSomeThingB();/事务属性PROPAGATION_REQUIRES
9、_NEWmethodB() main() methodA();相当于: / 获得个JTA事务管理器tm = getTransactionManager ();tm.begin();/ 开启个新的事务Transaction ts1 = tm.getTransaction ();doSomeThing();tm.suspend(); / 挂起当前事务try tm.begin();/ 重新开启第个事务Transaction ts2 = tm.getTransaction ();methodB();/ 释放资源/ methodB执完后,复恢第个事务tm.resume(ts1);mit();/ 提交第个
10、事务 catch(RunTimeException ex) ts1.rollback();/ 回滚第个事务 finally /释放资源在这,我把 ts1称为外层事务,ts2称为内层事务。从上的代码可以看出,ts2与ts1是两个独的事务,互不相。Ts2是否成功并不依赖于ts1。如果methodA法在调methodB法后的doSomeThingB法失败了,methodB法所做的结果依然被提交。除了methodB之外的其它代码导致的结果却被回滚了。使PROPAGATION_REQUIRES_NEW,需要使JtaTransactionManager作为事务管理器。(5)PROPAGATION_NOT_
11、SUPPORTED 总是事务地执,并挂起任何存在的事务。使PROPAGATION_NOT_SUPPORTED,也需要使JtaTransactionManager作为事务管理器。(6)PROPAGATION_NEVER 总是事务地执,如果存在个活动事务,则抛出异常;(7)PROPAGATION_NESTED如果个活动的事务存在,则运在个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执。这是个嵌套事务,使JDBC 3.0驱动时,仅仅持DataSourceTransactionManager作为事务管理器。需要JDB
12、C 驱动的java.sql.Savepoint类。有些JTA的事务管理器实现可能也提供了同样的功能。使PROPAGATION_NESTED,还需要把PlatformTransactionManager的nestedTransactionAllowed属性设为true;nestedTransactionAllowed属性值默认为false;/ 事务属性PROPAGATION_REQUIRED/事务属性PROPAGATION_NESTED 如果单独调methodB法,则按REQUIRED属性执。如果调methodA法,相当于下的效果:/释放资源/释放资源当methodB法调之前,调setSavep
13、oint法,保存当前的状态到savepoint。如果methodB法调失败,则恢复到之前保存的状态。但是需要注意的是,这时的事务并没有进提交,如果后续的代码(doSomeThingB()法)调失败,则回滚包括methodB法的所有操作。嵌套事务个常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。内层事务操作失败并不会引起外层事务的回滚。PROPAGATION_NESTED 与PROPAGATION_REQUIRES_NEW的区别:它们常类似,都像个嵌套事务,如果不存在个活动的事务,都会开启个新的事务。使PROPAGATION_REQUIRES_NEW时,内层事务
14、与外层事务就像两个独的事务样,旦内层事务进了提交后,外层事务不能对其进回滚。两个事务互不影响。两个事务不是个真正的嵌套事务。同时它需要JTA事务管理器的持。使PROPAGATION_NESTED时,外层事务的回滚可以引起内层事务的回滚。内层事务的异常并不会导致外层事务的回滚,它是个真正的嵌套事务。DataSourceTransactionManager使savepoint持PROPAGATION_NESTED时,需要JDBC 3.0以上驱动及1.4以上的JDK版本持。其它的JTA TrasactionManager实现可能有不同的持式。PROPAGATION_REQUIRES_NEW 启动个新的, 不依赖于环境的 “内部” 事务。这个事务将被完全 commited 或 rolled back不依赖于外部事务, 它拥有的隔离范围, 的锁, 等等. 当内部事务开始执时, 外部事务将被挂起, 内务事务结束时, 外部事务将继续执。另, PROPAGATION_NESTED 开始个 “嵌套的” 事务, 它是已经存在事务的个真正的事务. 潜套事务开始执时, 它将取得个 savepoint. 如果这个嵌套事务失败, 我们将回滚到此 savepoint. 潜套事务是外部事务的部分, 只有外部事
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年空气净化机器人毕业设计
- 2026年机场工程索赔管理实务与风险防范
- 2026年老年人权益保障社会网络
- 2026年养老院水处理与饮水净化设备配置
- 2025甘肃省武威市、嘉峪关市、临夏州中考物理真题(原卷版)
- 2026年模特参加真人秀节目的注意事项
- 2026年心血管急救技能培训学习总结
- 2026年三只松鼠IP化运营与电商客户体验
- 2026年屋面雨水斗及落水管疏通记录
- 2026年留守儿童团体心理辅导领导者培训手册
- 2026江西中江国际工程有限公司社会招聘4人备考题库含答案详解(考试直接用)
- 2026云南曲靖市沾益区高投物业服务有限公司物业工作人员招聘6人考试备考试题及答案解析
- 2026年高考语文复习:高频易错错别字
- 足球场场地租赁及使用管理合同协议
- 2025年高考真题-化学(湖南卷) 含答案
- 招标代理服务服务方案
- 针刺伤应急预案
- 2021-2022学年统编版高中语文必修下册第六单元群文阅读(含答案)
- 企业内部控制审计工作底稿编制指南
- LED照明及驱动器基本知识培训解析课件
- 福建仁爱版英语中考情景交际题强化训练
评论
0/150
提交评论