我有一个主DB处理程序方法,它调用其他方法,这些方法也使用BD事物。
我为主方法添加了@Transactional注释,因为如果出现问题我想要回滚所有内容。
我的问题是:我是否应该为子方法添加此注释,或者它将知道子方法是从事务方法中调用的。
例如,在删除方法中发生异常,如何确保写入部分也将被回滚:
@Transactional
public void maintDbTings() {
writing();
deleting();
}
@Transactional //do I need this?
public void writing() {
//no exceptions
}
@Transactional //do I need this?
public void deleting() {
//exception occurs
}
答案 0 :(得分:4)
Spring在遇到使用@Transactional
注释的方法时开始一个事务。交易的范围
涵盖该方法的执行,方法调用的任何方法的执行,以及
等等,直到方法返回。配置所涵盖的任何受管资源
您在事务范围内使用的PlatformTransactionManager参与了
交易。例如,如果您使用org.springframework.jdbc.datasource.DataSourceTransactionManager
,则会从链接的DataSource
中检索连接
自动参与交易。
事务以两种方式之一终止:方法直接完成执行,事务管理器提交事务,或者方法抛出异常,事务管理器回滚事务。
我希望现在很清楚。
答案 1 :(得分:3)
用简单的英语,当你有这个:
@Transactional
public void maintDbTings() {
writing();
}
@Transactional //do I need this?
public void writing() {
//no exceptions
}
并致电 mainDbTings ,@Transactional
上的writing
无效。意味着为mainDbThings
启动的事务仍将以书面形式存在/打开。所以在这种情况下你可以轻松放弃它。
另一方面,由于writing
是公共,有人可能会将其称为期待它是事务性的,因为它最有可能是服务类。在这种情况下,将writing
设为@Transactional
是强制性的,您无法将其删除。
所以它确实满足了你的需求。
答案 2 :(得分:2)
您可以根据您的要求使用传播属性,如REQUIRED,REQUIRES_NEW,NESTED,如下所示:
http://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html