【484、执行某操作,前50次成功,第51次失败a全部回滚b前50次提交第51次抛异常,ab场景分别如何设置Spring(传播性)?】

170 阅读1分钟

在 Spring 中,事务的传播性是通过 Transaction Propagation(事务传播行为)来控制的。根据场景的不同,可以设置不同的传播性来控制事务的行为。

在场景 a 中,前 50 次成功,第 51 次失败时需要回滚所有操作。此时可以设置事务传播性为 REQUIRED,表示当前操作需要加入已有的事务中。在第 51 次操作时抛出异常,Spring 会回滚所有事务,包括前 50 次的提交操作。

代码示例:

@Service
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public class SomeService {

    public void someMethod() throws Exception {
        // 前 50 次操作成功
        for (int i = 1; i <= 50; i++) {
            doSomething(i);
        }

        // 第 51 次操作失败
        doSomething(51);
        throw new Exception("Some exception");
    }

    private void doSomething(int i) {
        // 操作代码
    }
}

在场景 b 中,前 50 次成功,第 51 次抛出异常时需要提交前 50 次操作。此时可以设置事务传播性为 REQUIRES_NEW,表示当前操作需要新开一个事务。在第 51 次操作时抛出异常,只会回滚当前操作的事务,而不会影响前 50 次操作的提交操作。

代码示例:

@Service
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public class SomeService {

    public void someMethod() throws Exception {
        // 前 50 次操作成功
        for (int i = 1; i <= 50; i++) {
            doSomething(i);
        }

        // 第 51 次操作抛出异常
        doSomething(51);
        throw new Exception("Some exception");
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    private void doSomething(int i) {
        // 操作代码
    }
}