我是否也应该在 spring 中为子方法添加 @Transactional 注释?
Should I put @Transactional annotation for submethods also in spring?
我有一个主要的 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
}
Spring 在遇到用 @Transactional
注释的方法时开始事务。交易范围
涵盖该方法的执行,该方法调用的任何方法的执行,以及
以此类推,直到方法returns。配置的涵盖的任何托管资源
PlatformTransactionManager 和您在交易范围内使用的参与
交易。例如,如果您使用 org.springframework.jdbc.datasource.DataSourceTransactionManager
,从链接 DataSource
检索的连接
自动参与交易。
事务以两种方式之一终止:要么方法直接完成执行,事务管理器提交事务,要么方法抛出异常,事务管理器回滚事务。
我希望现在清楚了。
用简单的英语来说,当你有这个:
@Transactional
public void maintDbTings() {
writing();
}
@Transactional //do I need this?
public void writing() {
//no exceptions
}
并调用mainDbTings,writing
上的@Transactional
没有效果。这意味着为 mainDbThings
开始的交易仍将是 present/open 的书面形式。所以在这种情况下你可以很容易地放弃它。
另一方面,由于 writing
是 public 有人可能会称它为 期望 它是事务性的,因为它很可能是一项服务 class。在这种情况下,将 writing
设为 @Transactional
是强制性的,您不能删除它。
所以这真的取决于您的需求。
您可以根据您的要求使用 REQUIRED、REQUIRES_NEW、NESTED 等传播属性,如下所述 link:
http://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html
我有一个主要的 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
}
Spring 在遇到用 @Transactional
注释的方法时开始事务。交易范围
涵盖该方法的执行,该方法调用的任何方法的执行,以及
以此类推,直到方法returns。配置的涵盖的任何托管资源
PlatformTransactionManager 和您在交易范围内使用的参与
交易。例如,如果您使用 org.springframework.jdbc.datasource.DataSourceTransactionManager
,从链接 DataSource
检索的连接
自动参与交易。
事务以两种方式之一终止:要么方法直接完成执行,事务管理器提交事务,要么方法抛出异常,事务管理器回滚事务。
我希望现在清楚了。
用简单的英语来说,当你有这个:
@Transactional
public void maintDbTings() {
writing();
}
@Transactional //do I need this?
public void writing() {
//no exceptions
}
并调用mainDbTings,writing
上的@Transactional
没有效果。这意味着为 mainDbThings
开始的交易仍将是 present/open 的书面形式。所以在这种情况下你可以很容易地放弃它。
另一方面,由于 writing
是 public 有人可能会称它为 期望 它是事务性的,因为它很可能是一项服务 class。在这种情况下,将 writing
设为 @Transactional
是强制性的,您不能删除它。
所以这真的取决于您的需求。
您可以根据您的要求使用 REQUIRED、REQUIRES_NEW、NESTED 等传播属性,如下所述 link:
http://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html