日常开发中,一个方法中避免不了多次操作数据库,很多场景下会使用@Transactional注解,难免会出现大事务(业务代码也包含在其中),同时不在一个事务中,很可能就会引发事务问题,以下为事务封装工具类
工具类
@Component
public class TransactionSupport {
@Transactional(rollbackFor = Exception.class)
public void execute(Func func) {
func.run();
}
@FunctionalInterface
interface Func {
void run();
}
}
测试类
public class TestTransactional {
@Autowired
private TransactionSupport support;
public void test() {
support.execute(() -> {
//删除
//新增
});
}
}
解读
TransactionalSupport类的execute方法上标记了@Transactional(rollbackFor = Exception.class)注解,这意味着该方法中的数据库操作将会在一个事务中执行。在Spring中,默认情况下,只有未检查异常(即RuntimeException及其子类)会触发事务回滚,所以使用rollbackFor = Exception.class确保了在任何异常情况下都会回滚事务,包括受检查异常。
事务将在execute方法内部的Lambda表达式中启动。在Lambda表达式内部,如果任何数据库操作(删除或新增数据)抛出了未捕获的异常(无论是RuntimeException还是受检查异常),Spring将会自动回滚事务。
因此,使用这种方式确实可以保证在Lambda表达式中的多个数据库操作(删除和新增)在同一个事务中执行,并且如果发生异常,整个事务将会回滚,保证了ACID(原子性、一致性、隔离性、持久性)特性。
注意事项:
确保TransactionalSupport类被正确配置为Spring的组件(比如通过@Component或者在配置类中进行注册)。
确保在Spring上下文中能够正确地识别和管理事务配置和数据库连接。