@Transactional注解有什么用

Aru*_*run 6 ejb transactional

我是 EJB 项目的新手。并且我试图了解在@Transactional我的 EJB 方法顶部使用注释。我搜索了内容,对此没有明确的解释。任何人都可以清楚地解释这一点。

Mil*_*kic 7

@Transactional来自 Spring 世界,但 Oracle 最终将其包含在 Java EE 7 规范 ( docs ) 中。以前,您只能使用注释对 EJB 进行@TransactionAttribute注释,现在对于 CDI 也可以使用类似的方法,使用@Transactional. 这些注释的目的是什么?它是应用程序服务器的一个信号,表明某些类或方法是事务性的,还表明它在某些条件下的行为方式,例如,如果它在事务中被调用等。

一个例子:

@Transactional(Transactional.TxType.MANDATORY)
public void methodThatRequiresTransaction()
{
..
}
Run Code Online (Sandbox Code Playgroud)

如果不是在事务中调用,上面的方法将抛出异常。

@Transactional(Transactional.TxType.REQUIRES_NEW)
public void methodThatWillStartNewTransaction()
{
..
}
Run Code Online (Sandbox Code Playgroud)

Interceptor 将开始一个新的 JTA 事务来执行此方法,无论它是否在正在运行的事务中调用。但是,如果在事务内部调用它,则该事务将在执行此方法期间暂停。

也可以看看:

  • @Arun 在编写方法时,您通常无法预料它将如何在业务场景中使用。一个客户端可能会启动自己的事务,然后调用您的方法,其他客户端可能根本不使用事务。通过指定适当的 Transactional.TxType,您可以根据事务上下文控制方法的执行。例如,如果你在你的方法中所做的一切都需要在一个事务中并且你不关心它是否从事务上下文中调用,那么使用`@Transactional(Transactional.TxType.REQUIRED)` (2认同)