Spring 事务回滚问题请教
发布网友
发布时间:2022-04-25 21:58
我来回答
共2个回答
热心网友
时间:2022-06-17 22:03
有个很简单的办法:
1、ACD配置需要事务@Transactional(propagation = Propagation.REQUIRED)
2、B 方法上面配置新事务 @Transactional(propagation = Propagation.REQUIRES_NEW)
3、直接捕捉D方法的异常 不做处理 例如 代码这么写
A;
B;//配置另开事务@Transactional(propagation = Propagation.REQUIRES_NEW)
C;
try{
D;
}catch(Exception e){
// 随意
}
就可以导致回滚机制拿不到d抛出的异常,不做回滚处理。
在A,c处出现数据库异常会抛到外层方法导致回滚, 而B 只要执行了 跟他们事务隔离 不受影响。
另:如果java check异常也要加入到回滚机制 ,还需要配置rollbackfor
热心网友
时间:2022-06-17 22:04
Spring有以下几种事务传播行为可配置:
PROPAGATION_REQUIRED
支持当前事务,如果当前没有事务,就新建一个事务。
PROPAGATION_SUPPORTS
支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY
支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW
新建事务,如果当前存在事务,把当前事务挂起,新建一个事务。
PROPAGATION_NOT_SUPPORTED
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER
以非事务方式执行,如果当前存在事务,则抛出异常。
我认为可以如下配置
public class DemoService {
@Transactional(propagation = Propagation.REQUIRED)
public void service() {
a();
b();
c();
}
@Transactional(propagation = Propagation.REQUIRED)
public void a() {
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void b() {
}
@Transactional(propagation = Propagation.REQUIRED)
public void c() {
}
}