@Transactional(传播= Propagation.REQUIRED)

时间:2012-05-24 14:57:07

标签: java spring annotations

如果有人可以解释这个注释的作用以及我们何时使用它:

@Transactional(propagation=Propagation.REQUIRED)

由于

4 个答案:

答案 0 :(得分:141)

如果您需要外行解释使用Spring Docs

以外的用法

考虑这段代码......

class Service {
    @Transactional(propagation=Propagation.REQUIRED)
    public void doSomething() {
        // access a database using a DAO
    }
}

当调用doSomething()时,它知道它必须在执行之前在数据库上启动一个Transaction。如果此方法的调用者已启动事务,则此方法将在当前数据库连接上使用相同的物理事务。

@Transactional注释提供了一种方法,可以在代码执行时告知代码必须拥有事务。它不能在没有一个的情况下运行,所以你可以在你的代码中假设你不会在数据库中留下不完整的数据,或者如果发生异常就必须清理一些东西。

交易管理是一个相当复杂的主题,所以希望这个简化的答案是有帮助的

答案 1 :(得分:57)

当传播设置为PROPAGATION_REQUIRED时,将为应用该设置的每个方法创建逻辑事务范围。每个这样的逻辑事务范围可以单独确定仅回滚状态,外部事务范围在逻辑上独立于内部事务范围。当然,在标准PROPAGATION_REQUIRED行为的情况下,所有这些范围将映射到同一物理事务。因此,内部事务范围中的仅回滚标记集确实会影响外部事务实际提交的机会(正如您所期望的那样)。

enter image description here

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html

答案 2 :(得分:14)

在Spring应用程序中,如果使用<tx:annotation-driven/>启用基于注释的事务支持并使用 @Transactional(propagation = Propagation.REQUIRED)注释任何类/方法,则Spring框架将启动事务并执行该方法并提交事务。如果发生任何RuntimeException,则将回滚事务。

实际传播=传播.REQUIRED是默认传播级别,您不需要明确提及它。

有关详细信息:http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html#transaction-declarative-annotations

答案 3 :(得分:5)

要了解事务管理采用的各种事务设置和行为,例如REQUIREDISOLATION等,您必须了解事务管理本身的基础知识。

阅读Trasaction management了解更多信息。