抱歉,如果之前已经讨论过这个问题,我只是在@transactional spring java annotation的所有相关讨论中都找不到答案。
如果我们在另一个没有@transactional注解的示例中从一个有@transactional注解的方法中调用一个方法,会发生什么?@transactional annotated方法中的事务是否将被挂起?还是会被传播?
我发现有很多关于第二个方法的调用是否来自同一个示例的讨论,但是第二个非事务性方法是否在另一个示例中的讨论却不多。谢谢你的帮助!
像下面的例子一样,如果从类a的methoda()调用类b中的methodb(),会发生什么?methoda中的事务是传播的还是非事务的?
示例代码如下:
public class A
{
@Autowired
B b;
@Transactional
public void methoda(){
b.methodb();
}
}
@Component
public class B
{
//this method is non transactional and is called from method A in class A
public void methodb()
{
//do some db updates
}
}
1条答案
按热度按时间cnh2zyt31#
如果b中没有@transactional注解来告诉它,那么b方法使用在调用a.methoda中建立的事务。这对于spring来说是正常的,我们有标记为transactional的组件,这些组件调用参与当前事务的dao,而本身没有标记为transactional。
如果确实要挂起当前事务,可以将此注解添加到b方法:
关于在spring api文档中挂起事务有一个警告:
注意:实际的事务暂停并不是在所有事务管理器上都是开箱即用的。这尤其适用于jtatransactionmanager,它要求javax.transaction.transactionmanager对其可用(在标准JavaEE中是特定于服务器的)。