@Transactional(传播= Propagation.REQUIRED)

如果有人可以解释这个注释是做什么的,什么时候我们使用它:

@Transactional(propagation=Propagation.REQUIRED) 

谢谢

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

在这里输入图像说明

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

如果你需要一个非凡的解释,超越Spring文档中提供的使用

考虑这个代码…

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

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

这个@Transactional注解提供了一个告诉你的代码在执行时必须有一个Transaction的方法。 它不会运行没有一个,所以你可以在你的代码中做这个假设,你不会在数据库中留下不完整的数据,或者如果发生exception,必须清理一些东西。

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

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

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

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

Spring REQUIRED行为意味着如果在当前bean方法执行上下文中有一个已经打开的事务 ,将使用same transaction如果 没有现有的事务 ,Spring容器将创build一个新的 事务 。 如果以嵌套方式调用configuration为REQUIRED行为的多个方法,则会为其分配不同的逻辑事务,但它们将共享相同的物理事务。 简而言之,这意味着如果内部方法导致事务回滚,则外部方法将无法提交,并且还会回滚事务

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

阅读Trasactionpipe理更多的解释。