Spring事务管理理解分析

上传人:lis****210 文档编号:184015561 上传时间:2023-02-01 格式:DOCX 页数:5 大小:15.03KB
收藏 版权申诉 举报 下载
Spring事务管理理解分析_第1页
第1页 / 共5页
Spring事务管理理解分析_第2页
第2页 / 共5页
Spring事务管理理解分析_第3页
第3页 / 共5页
资源描述:

《Spring事务管理理解分析》由会员分享,可在线阅读,更多相关《Spring事务管理理解分析(5页珍藏版)》请在装配图网上搜索。

1、spring自建事务管理模块。而且这个事务管理是一个抽象设计,可以应用到很 多场合,包括普通的DataSource,jta,jms和hibernate上。要正确使用spring的事务,首先需要了解spring在事务设计上的一些概念 统观spring事务,围绕着两个核心PlatformTransactionManager和 TransactionStatusPlatformTransactionManager直译过来就是平台相关事务,这里的平台指的是 “事务源”,包括刚才我说的DataSource,jta等等。这些无一不是一个事务源。广义的说,凡是可以完成事务性操作的对象,都可以设计出相对应的

2、PlatformTransactionManager, 只要这个事务源支持 commit, rollback 和 getTransaction 语意。查看spring代码,可以发现这些manager实现事务,就是调用事务源的事务操 作方法比如HibernateTransactionManagerJava 代码1. protected void doCommit(DefaultTransactionStatus status); (2. HibernateTransactionObject txObject = (HibernateTransac tionObject); status.getT

3、ransaction();3. if (status.isDebug();); (4. logger.debug(Committing Hibernate transaction on s ession +5. txObject.getSessionHolder();.getSession(); + );6. 7. try (8. txObject.getSessionHolder();.getTransaction();.comm it();9. 10.11.12. jdbc 的 DataSourceTransactionManagerJava 代码:ft1. protected void

4、doCommit(DefaultTransactionStatus status); (2. DataSourceTransactionObject txObject = (DataSourceTrans actionObject); status.getTransaction();3. Connection con = txObject.getConnectionHolder();.getCon nection();4. if (status.isDebug();); (5. logger.debug(Committing JDBC transaction on connec tion +

5、con + );6. 7. try(8. mit();9. 10. .11. 那么PlatformTransactionManager以什么依据处理事务呢?是 TransactionStatus查看api发现这个接口有三个方法isNewTransaction(),isRollbackOnly(),setRollbackOnly()PlatformTransactionManager就是根据前两个方法决定是否要创建一个新事务, 是要递交还是回滚。至于第三个方法是改变事务当前状态的,很多地方都要用到, 偏偏PlatformTransactionManager自身好像不怎么用,毕竟事务状态的改变是

6、由程序员代码决定的,不需要一个manager多管闲事。总结上面所说的,spring 的事务由 PlatformTransactionManager 管理,manager 最后调用事务源的方法来实现一个事务过程。而manager通过 TransactionStatus来决定如何实现。接下去说 spring 事务中的 TransactionTemplate 和 TransactionInterceptorTransactionTemplate其实和spring中其他的template的作用类似,起到化简 代码的作用,不要被它那么长的名字吓倒了,事实上这个template并不是什么 非常核心的对象。

7、如果比较学究派的,可以去看看template设计模式,在此就 不再对此赘述了。为什么要有 TransactionTemplate?先来看看如果没有 TransactionTemplate, 我们的代码该怎么写先来看看spring reference中的一段代码Java代码寸31. DefaultTransactionDefinition def = new DefaultTransactionDefini tion();2. def.setPropagationBehavior(TransactionDefinition.PROPAGATION_RE QUIRED);3.3. Transact

8、ionStatus status = transactionManager.getTransaction(de f);5.4. try (5. / execute your business logic here6. catch (MyException ex); (7. transactionManager.rollback(status);8. throw ex;9. 10. transactionMmit(status);这是直接使用transactionManager的例子,可以看到真正执行business logic 的地方是在try当中那段,前后的代码都是为了完成事务管理的。如果每

9、个 business logic都要写上那么一段,我肯定是疯了。我们翻出 TransactionTemplate的代码看看他怎么化简了我们的代码Java代码奇1. public Object execute(TransactionCallback action); throws Trans actionException (2. TransactionStatus status = this.transactionManager.getT ransaction(this);3. Object result=null;4. try (5. result = action.doInTransact

10、ion(status);6. 7. catch(RuntimeException ex); (8. / transactional code threw application exception - rollback9. rollbackOnException(status,ex);10. throw ex;11. 12. catch (Error err);(13. / transactional code threwerror - rollback14. rollbackOnException(status,err);15. throw err;16. 17. this.transact

11、ionMmit(status);18. return result;19. 同上面的代码如出一辙,前后是事务处理代码,当中那段result = action.doInTransaction(status);是我们的应用代码。至于action是什么,全 看各位的需要了。但是有一点要主要,如果利用TransactionTemplate,那么他 不管你扔出什么异常都会回滚事务,但是回滚的是哪个事务呢?继续挖代码 Java 代码1. private void rollbackOnException(TransactionStatus status, Thro wable ex); throws Tra

12、nsactionException (2. if (logger.isDebugEnabled();); (3. logger.debug(Initiating transaction rollback on ap plication exception, ex);4. 5. try(6. this.transactionManager.rollback(status);7. 8. catch(RuntimeException ex2); (9. logger.error(Application exception overridden by r ollback exception, ex);

13、10. throw ex2;11. 12. catch (Error err); (13. logger.error(Application exception overridden by r ollback error, ex);14. throw err;15. 16. 真相大白,是对template所持有的某个transactionManager进行回滚。所以如 果你的应用代码用的是事务源a的一些资源,比如到服务器a的一个datasource, 但是你的transactionManager管理的是另一些资源,比如服务器b的一个 datasource,代码铁定不会正常运行特别是在一些多事务

14、源的程序里,这点千万不能搞错。如果多个事务源之间要完 成全局事务,还是老老实实用分布式事务管理服务吧(jta)那么TransactionInterceptor是十什么的?这个是spring的声明式事务的支 持方式。因为用TransactionTemplate要硬编码,而且调整事务策略很麻烦(不 是说不能调。举个例子原来程序抛出异常A需要回滚,现在不需要要,我就可以 把a catch吃掉。这时候template就不会回滚了。但是每次调整都要重写编码。) 而用TransactionInterceptor就可以将这些调整写在配置中。我们再来挖 TransactionInterceptor 的代码Ja

15、va代码费l1. public Object invoke(MethodInvocation invocation); throws Throw able (2. / Work out the target class: may be null.3. / The TransactionAttributeSource should be passed the target class4. / as well as the method, which may be from an interfac e5. Class targetClass = (invocation.getThis(); !=

16、null); ? invocation.getThis();.getClass(); : null;6.6. / Create transaction if necessary7. Transactioninfo txInfo = createTransactionIfNecessary(i nvocation.getMethod();, targetClass);9.8. Object retVal = null;9. try (10. / This is an around advice.11. / Invoke the next interceptor in the chain.12.

17、/ This will normally result in a target object bei ng invoked.13. retVal = invocation.proceed();14. 15. catch(Throwable ex); (16. / target invocation exception17. doCloseTransactionAfterThrowing(txInfo,ex);18. throw ex;19. 20. finally(21. doFinally(txInfo);22. 23. doCommitTransactionAfterReturning(t

18、xInfo);26.24. return retVal;25. 万变不离其宗。所以使用spring的事务管理需要作这些事1,设置好事务源,比如DataSource, hibernate的session。如果有多个事务 源要考虑他们之间是否有全局事务,如果有,老老实实用jta,否则就需要自己 写一个 manager 了2, 设置manager,根据你的事务源选择对应的PlatformTransactionManager3, 选择实现事物的方式,用template还是interceptor。用template代码直 观点,但是template所管辖的manager和你应用代码所用的事务源要一致。如 果用interceptor千万注意,一定要调用interceptor那个bean,而不是原始 的那个target。在坛子上我已经看到至少有两个朋友说spring事物不起作用, 从配置和代码上看都正确,这时要好好查查,调用的bean是哪一个。4, 这个是设计问题了,推荐事务处于一个较高层次,比如service上的某个函 数,而底层的dao可以不考虑事务,否则可能会出现事务嵌套,增加程序复杂度。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!