@Transactional(propagation = Propagation.REQUIRED)


Answers:


65

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

在此处输入图片说明

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


166

如果您需要超越Spring Docs所提供的用法的外行解释

考虑这段代码...

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

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

@Transactional批注提供了一种在执行代码时告诉您代码必须具有事务处理的方法。它不会一无是处,因此您可以在代码中做出这样的假设,即您不会在数据库中留下不完整的数据,或者如果发生异常,则必须清理某些内容。

事务管理是一个相当复杂的主题,因此希望这个简化的答案会有所帮助



如果使用基于代理的配置来声明和访问DAO层,则DAO类中的方法也必须使用@Transactional进行注释。
Kurapika '17

如果您已经添加@Transactional到服务层,则不需要进一步添加@Transactional该事务中正在调用的DAO方法。
布拉德(Brad)

如果doSomething()调用另一个没有任何@transactional的嵌套方法,那么同一笔交易也将应用于该调用方法吗?
thisarattr

是的,只要使用相同的线程来执行嵌套方法(即,您不会显式创建新的线程)。这是因为Spring事务使用ThreadLocal变量绑定到当前线程
Brad

15

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

实际上,propagation = Propagation.REQUIRED是默认的传播级别,您无需明确提及它。

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


5

要了解事务管理采取的各种事务设置和行为,如REQUIREDISOLATION等你必须了解交易管理本身的基本知识。

阅读事务管理以获取更多解释。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.