如果有人可以解释此注释的作用以及我们何时使用它:
@Transactional(propagation=Propagation.REQUIRED)
谢谢
如果您需要在 Spring Docs 中提供的用途之外的外行解释
考虑这段代码...
class Service {
@Transactional(propagation=Propagation.REQUIRED)
public void doSomething() {
// access a database using a DAO
}
}
当 doSomething() 被调用时,它知道它必须在执行之前在数据库上启动一个事务。如果此方法的调用者已经启动了一个事务,那么此方法将在当前数据库连接上使用相同的物理事务。
此 @Transactional
注释提供了一种在代码执行时告诉您的代码它必须具有事务的方法。没有它就不会运行,因此您可以在代码中做出这样的假设,即您不会在数据库中留下不完整的数据,或者如果发生异常则必须清理某些内容。
事务管理是一个相当复杂的主题,所以希望这个简化的答案会有所帮助
当传播设置为 PROPAGATION_REQUIRED 时,将为应用该设置的每个方法创建一个逻辑事务范围。每个这样的逻辑事务范围可以单独确定仅回滚状态,外部事务范围在逻辑上独立于内部事务范围。当然,在标准 PROPAGATION_REQUIRED 行为的情况下,所有这些范围都将映射到同一个物理事务。因此,在内部事务范围内设置的仅回滚标记确实会影响外部事务实际提交的机会(正如您所期望的那样)。
https://i.stack.imgur.com/OEe1L.png
http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html
在 Spring 应用程序中,如果您使用 <tx:annotation-driven/>
启用基于注释的事务支持并使用 @Transactional(propagation=Propagation.REQUIRED) 注释任何类/方法,则 Spring 框架将启动事务并执行该方法并提交事务。如果发生任何 RuntimeException,则事务将回滚。
实际上propagation=Propagation.REQUIRED 是默认的传播级别,您不需要明确提及它。
不定期副业成功案例分享
@Transactional
添加到服务层,则无需进一步将@Transactional
添加到在该事务中调用的 DAO 方法。doSomething()
在没有任何 @transactional 的情况下调用另一个嵌套方法,那么相同的事务是否也会应用于该调用方法?