2011-06-03 1028 views
35

我在Service类中看到了一个标记为@Transactional的方法,但它也调用了同一类中未标记为@Transactional的其他方法。@Transactional方法调用另一个没有@Transactional注解的方法?

这是否意味着调用不同的方法使应用程序打开单独连接到数据库或暂停父事务,等等?

什么是对的方法,而不由与@Transactional注释的另一种方法叫任何注释的默认行为?

感谢

回答

49

当你调用一个事务块中没有@Transactional的方法,父事务将继续新的方法。它将使用从父方法(与@Transactional)相同的连接,并引起了所谓的方法(不@Transactional任何异常将导致事务回滚作为事务定义配置。

如果你调用一个方法而@Transactional在同一实例中使用@Transactional的方法进行注释,则被调用方法的事务行为不会对事务产生任何影响。但是,如果您从具有事务定义的另一方法调用具有事务定义的方法,并且它们处于不同的实例,然后在调用方法的代码将遵循调用的方法给出的交易的定义。

你可以找到更多详情请参阅声明式交易管理spring transaction documentation

Spring声明式事务模型使用AOP代理。所以AOP代理负责创建交易。只有当实例中的方法从实例外调用时,AOP代理才会处于活动状态。

+0

是弹簧默认行为? – goe 2011-06-03 03:18:34

+0

是的。这是默认行为。 – 2011-06-03 03:20:22

+0

@Arun对于事务传播属性还有一个维度。在['@ Transactional'](http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/transaction/annotation/Transactional.html)可以指定传播属性即是枚举值键入['@ Propagation'](http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/transaction/annotation/Propagation.html)。 – 2011-06-03 12:43:32

5

@Transactional标志着事务边界(开始/结束),但是交易本身被绑定到线程。一旦事务开始,它将在方法调用中传播,直到原始方法返回并且事务提交/回滚。

如果另一个方法被称为具有@Transactional注解然后传播取决于注释的传播属性。

12
  • 这是否意味着分离方法的调用会导致应用程序打开到DB的单独连接或挂起父事务等?

这取决于propagation level。这里是所有可能的级别values

例如,在案件的传播水平NESTED当前事务会“暂停”和一个新的事务将被创建(注:嵌套事务的实际创建将只在特定的事务管理器工作)

  • 没有通过@Transactional注解由另一个方法调用的任何注释的方法的默认行为是什么?

默认传播级别(您称之为“行为”)为REQUIRED。在情况下,“内”方法被调用,其具有在其上的注释@Transactional(或经由XML声明交易),它将所述同一事务,例如内执行“没有新的”被创建。

+0

那些没有任何注释的NOT_SUPPORTED子调用呢?它是否继承了NOT_Supported或者是否因为REQURED是默认值而打开了新的事务?例如:f1.call(){f2()},注释NOT_SUPPORTED用于f1,非注解用于f2。 – Dave 2017-07-07 21:07:50

相关问题