全网网站推广浙江建设职业技术学校网站登录
全网网站推广,浙江建设职业技术学校网站登录,南岸网站建设,怎么做仿制网站前言Spring的声明式事务让我们不在编写获得连接、关闭连接、开启事务、提交事务、回滚事务等代码#xff0c;通过一个简单的Transactional注解#xff0c;就让我们轻松进行事务处理。我们知道Spring事务基于AOP#xff0c;采用动态代理实现#xff0c;虽然使用简单#xf…前言Spring的声明式事务让我们不在编写获得连接、关闭连接、开启事务、提交事务、回滚事务等代码通过一个简单的Transactional注解就让我们轻松进行事务处理。我们知道Spring事务基于AOP采用动态代理实现虽然使用简单但是在实际场景中我们也会遇到一些坑。而往往遇到坑之后我们都会茫然这是由于没有对Spring事务的实现机制做一点了解导致的。因此本篇博客将从原理的角度分析下动态代理给Spring事务埋下的坑从动态代理到Spring事务UserServiceUserService接口txMethod和txMethod2方法模拟事务方法(相当于Transactional) noTxMethod方法是普通方法UserServiceImplUserServiceImpl在Spring事务中我们往往是在Service层进行事务控制。 我们在UserServiceImpl中想模拟的是一个有事务的方法去调用另一个有事务的方法会怎么样一个没有事务的方法去调用一个有事务的方法会怎么样UserHandlerUserHandler这里为了简便通过方法名称来判断是否开启事务。显然txMethod方法、txMethod2方法都“应该”开启事务。UserTestUserTest下面我们来说下运行结果proxyInstance.txMethod2()方法会开启事务这没有问题。proxyInstance.txMethod()方法虽然在事务方法txMethod()内部调用了txMethod2()事务方法但是并没有新开启事务。proxyInstance.noTxMethod()方法虽然在没有事务的方法noTxMethod()内部调用了有事务的txMethod2()方法但是并没有开启事务。下面让我们来对应下Spring事务中的现象Spring事务上述的情况说白了就是在一个Service内部事务方法之间的嵌套调用普通方法和事务方法之间的嵌套调用都不会开启新的事务 为什么会这样呢 其实通过上面的动态代理的代码你应该可以发现动态代理最终都是要调用原始对象的而原始对象在去调用方法时是不会再触发代理了那么如何解决呢很简单我们完全可以在抽出一个XxxService在其内部调用UserService.txMethod()和UserService.txMethod2()方法即可。总而言之避免在一个Service内部进行事务方法的嵌套调用(因为动态代理导致这种场景事务失效了。)好像Spring事务如此简单但是背后却有这些道道你被坑过么
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/87945.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!