原理:
在事物提交的时候,spring事物源码会检查该状态,如果为true则commit失败。
使用场景:
1、与异常处理的区别
方式 | 触发条件 | 控制粒度 |
---|---|---|
setRollbackOnly() | 主动逻辑判断调用 | 精确控制回滚点 |
抛出RuntimeException | 系统自动触发 | 依赖异常传播 |
@TransactionAttribute(REQUIRED)
public void processOrder(Order order) {
try {
inventoryService.reserveStock(order); // 库存操作
if (order.hasInvalidItems()) {
ejbContext.setRollbackOnly(); // 主动标记回滚
return;
}
paymentService.charge(order); // 支付操作
} catch (PaymentException e) {
ejbContext.setRollbackOnly(); // 异常时标记回滚
}
// 未标记则自动提交
}
2、嵌套事物报错
Spring事务Transaction rolled back because it has been marked as rollback-only
嵌套事物导致,a调用b,公用一个threadlocal,b设置了只能回滚,a方法commit事物就会报错