利用函数式接口剥离事务操作
任何接口,如果只包含一个抽象方法,它就是一个函数式接口。对于函数式接口,可以通过Lambda表达式来创建该接口的对象
Runnable就是一个函数式接口。
- 新建一个函数式接口,并在抽象方法上加上
@Transactional的事务注解。 - 在实际业务逻辑中需要事务的地方,通过Lambda表达式创建该接口的对象(必须实现唯一的抽象方法)。
 - 执行该接口对象的方法,即将方法内的逻辑以事务的形式去执行。
 
spring事务的依赖:
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
</dependency>
public class Test {
    public void testTransaction() {
        int a = 0;
        int b = 1;
        TransactionConsumer transactionConsumer = () -> {
            insertDataA(a);
            updateDataB(b);
        };
        transactionConsumer.doInTransaction();
    }
    private void updateDataB(int b) {
    }
    private void insertDataA(int a) {
    }
}
@FunctionalInterface
public interface TransactionConsumer {
    @Transactional
    void doInTransaction();
}