Spring 事务传播和回滚行为
Spring Transaction propogation and rollback behaviour
@Service
public Class Demo(){
@Transactional(rollbackFor=CustomException.class)
@Override
public RetunType methodONE()throws Exception{
methodTWO();
methodFIVE();
}
@Transactional
@Override
public RetunType methodTWO()throws Exception{
methodFOUR();
methodTHREE();
throws new CustomException("error_msg");
}
@Transactional(propagation=Propagation.REQUIRES_NEW)
@Override
public RetunType methodTHREE(){
.
..
.
..
.
}
}
public Class CustomException extends Exception{
public CustomException(String msg){
super(msg)
}
}
我不想只回滚我的 methodThree 事务。现在它正在回滚 methodTWO/THREE/FOUR/FIVE 中所做的所有更改。我无法进一步理解。
我正在尝试在所有其他方法和 methodThree() 中执行与事务相关的代码,这只是数据库中的状态更新。
如果我明白你在这里想做的是在它自己的事务中嵌套一个父事务,那么你的问题可能是这些方法在同一个 class .
这很重要,因为 Spring 应用 AOP 的方式,在本例中通过应用事务逻辑,使用代理来拦截方法调用。问题是方法调用是内部的或自调用的,因此永远不会通过代理。这意味着永远不会为 MethodThree() 创建新事务。
您有两个选择:
将方法三移至单独的 class。
将模式从代理更改为 AspectJ,这会将事务逻辑编织到 class 本身。
@Service
public Class Demo(){
@Transactional(rollbackFor=CustomException.class)
@Override
public RetunType methodONE()throws Exception{
methodTWO();
methodFIVE();
}
@Transactional
@Override
public RetunType methodTWO()throws Exception{
methodFOUR();
methodTHREE();
throws new CustomException("error_msg");
}
@Transactional(propagation=Propagation.REQUIRES_NEW)
@Override
public RetunType methodTHREE(){
.
..
.
..
.
}
}
public Class CustomException extends Exception{
public CustomException(String msg){
super(msg)
}
}
我不想只回滚我的 methodThree 事务。现在它正在回滚 methodTWO/THREE/FOUR/FIVE 中所做的所有更改。我无法进一步理解。
我正在尝试在所有其他方法和 methodThree() 中执行与事务相关的代码,这只是数据库中的状态更新。
如果我明白你在这里想做的是在它自己的事务中嵌套一个父事务,那么你的问题可能是这些方法在同一个 class .
这很重要,因为 Spring 应用 AOP 的方式,在本例中通过应用事务逻辑,使用代理来拦截方法调用。问题是方法调用是内部的或自调用的,因此永远不会通过代理。这意味着永远不会为 MethodThree() 创建新事务。
您有两个选择:
将方法三移至单独的 class。
将模式从代理更改为 AspectJ,这会将事务逻辑编织到 class 本身。