SpringBoot中事务的配置与使用

1,381 阅读2分钟

1.开启事务

在Spring启动类中添加@EnableTransactionManagement可开启事务功能,默认已开启。

@SpringBootApplication
@EnableTransactionManagement(显式开启事务,SpringBoot默认开启,可省略)
public class EmosWxApiApplication {

    public static void main(String[] args) {
        SpringApplication.run(EmosWxApiApplication.class, args);
    }
}

2.配置事务隔离等级(isolation参数)

2.1什么是事务隔离等级?有什么作用?

事务的隔离分为四个等级:RU(Read Uncommitted)、RC(Read Committed)、RR(Repeatable Read)、 SERIALIZABLE。

2.2怎么使用?

可以通过为业务层中的方法添加@Transactional注解以设置事务,注解中设置参数@Transactional(isolation = '')以设计隔离等级,参数由枚举类来表示

public enum Isolation {
    DEFAULT(-1), //数据库中默认的隔离等级 如MySQL中是RR,Oracle支持RC和Serial,默认为RC
    READ_UNCOMMITTED(1),
    READ_COMMITTED(2),
    REPEATABLE_READ(4),
    SERIALIZABLE(8);
}

//例子
@Transactional(isolation = Isolation.DEFAULT)

3.配置事务传播行为(propagation参数)

3.1什么是事务的传播行为?

事务传播行为: 指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。

3.2怎么设置传播参数?

传播参数的共分为7种

public enum Propagation {
    REQUIRED(0),
    SUPPORTS(1),
    MANDATORY(2),
    REQUIRES_NEW(3),
    NOT_SUPPORTED(4),
    NEVER(5),
    NESTED(6);
}

3.2.1 REQUIRED

执行被修饰的方法时,如果有事务上下文则加入该事物,如果没有则新开启一个事务。

3.2.2 SUPPORTS

执行被修饰的方法时,如果存在事务上下文,则加入该事务,如果没有则非事务地执行。

3.2.3 MANDATORY

执行被修饰的方法时,如果存在事务上下文,则加入该事务,如果没有则抛出异常
throw new IllegalTransactionStateException(“Transaction propagation ‘mandatory’ but no existing transaction found”);

3.2.4 REQUIRES_NEW

A执行被修饰的方法B时,先把调用者事务A挂起,再执行完被修饰的事务B后,再执行A,A事务是否成功提交不影响B事务。如果事务A发生回滚也不会影响到事务B的提交。

3.2.5 NOT_SUPPORTED

总是非事务地执行,并挂起任何存在的事务。

3.2.6 NEVER

总是非事务性地执行,如果存在一个活动的事务则抛出异常。

3.2.7 NESTED

也是嵌套模式,类似于REQUIRES_NEW,事务A调用B方法,则A挂起,先执行B,执行完了在恢复执行A,但是有一点不同,A如果执行失败回滚了会导致内层的B也回滚,但是B如果执行失败了并不会导致外层的A回滚。
如果调用B方法的A方法不存在事务,则B等于是REQUIRED。

4.配置只读(read-only)

@Transactional(isolation = Isolation.DEFAULT)

5.注意事项

待补充