如果有人可以解释此批注的用途以及确切的使用时间:
@Transactional(propagation=Propagation.REQUIRED)
谢谢
如果有人可以解释此批注的用途以及确切的使用时间:
@Transactional(propagation=Propagation.REQUIRED)
谢谢
Answers:
当传播设置为PROPAGATION_REQUIRED时,将为应用该设置的每种方法创建一个逻辑事务作用域。每个这样的逻辑事务作用域可以单独确定仅回滚状态,而外部事务作用域在逻辑上独立于内部事务作用域。当然,在标准PROPAGATION_REQUIRED行为的情况下,所有这些范围都将映射到同一物理事务。因此,内部事务范围中设置的仅回滚标记确实会影响外部事务实际提交的机会(正如您期望的那样)。
http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html
如果您需要超越Spring Docs所提供的用法的外行解释
考虑这段代码...
class Service {
@Transactional(propagation=Propagation.REQUIRED)
public void doSomething() {
// access a database using a DAO
}
}
调用doSomething()时,它知道必须在执行之前在数据库上启动事务。如果此方法的调用者已经启动了事务,则此方法将在当前数据库连接上使用相同的物理事务。
此@Transactional
批注提供了一种在执行代码时告诉您代码必须具有事务处理的方法。它不会一无是处,因此您可以在代码中做出这样的假设,即您不会在数据库中留下不完整的数据,或者如果发生异常,则必须清理某些内容。
事务管理是一个相当复杂的主题,因此希望这个简化的答案会有所帮助
@Transactional
到服务层,则不需要进一步添加@Transactional
该事务中正在调用的DAO方法。
doSomething()
调用另一个没有任何@transactional的嵌套方法,那么同一笔交易也将应用于该调用方法吗?
在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