Spring @Transactional方法 – 参与交易
在一个道具我有2个@Transactional方法。
如果我不提供任何明确的属性,
那么会发生什么,如果
我在另一个体内运行一种方法?
这两种方法都在同一个交易中运行?
Spring AOP中的代理
使用Transactional时,您正在处理类的代理,因此在这种情况下:
@Transactional public void doSomeThing(){ // calling this method targets a proxy doSomeThingElse(); // this method targets the actual class, not the PROXY, // so the transactional annotation has no effect } @Transactional public void doSomeThingElse(){ }
您从外部调用代理,但第二个方法调用是从代理对象内部进行的,因此没有事务支持。 很自然地,无论第二种方法中@Transactional注释的值是什么,它们都在同一个事务中运行
所以如果你需要单独的交易,你必须打电话
yourservice.doSomething(); yourservice.doSomethingElse();
从外面。
整个场景在Spring AOP>理解AOP代理一章中得到了很好的解释,包括这个“解决方案”:
从内部访问当前AOP代理对象
public class SimplePojo implements Pojo { public void foo() { // this works, but... gah! ((Pojo) AopContext.currentProxy()).bar(); } public void bar() { // some logic... } }
@Transactional
的propagation
属性的默认值是REQUIRED
,这意味着:
支持当前事务,如果不存在则创建新事务。
所以是的 – 两种方法都将在同一个事务中运行。
但是一个重要的建议是: 不要让你的DAO交易 。 服务应该是交易性的,而不是DAO。
spring的文件
一个说明:
在代理模式(默认设置)下,只拦截通过代理进入的外部方法调用。 这意味着自调用实际上是目标对象中调用目标对象的另一个方法的方法,即使被调用的方法用@Transactional标记,也不会在运行时导致实际的事务。