在 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) {
// 操作代码
}
}