1.开启事务
在Spring启动类中添加@EnableTransactionManagement可开启事务功能,默认已开启。
@SpringBootApplication@EnableTransactionManagement(显式开启事务,SpringBoot默认开启,可省略)publicclassEmosWxApiApplication{publicstaticvoidmain(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 = '')以设计隔离等级,参数由枚举类来表示
publicenumIsolation{DEFAULT(-1),//数据库中默认的隔离等级如MySQL中是RR,Oracle支持RC和Serial,默认为RCREAD_UNCOMMITTED(1),READ_COMMITTED(2),REPEATABLE_READ(4),SERIALIZABLE(8);}//例子@Transactional(isolation=Isolation.DEFAULT)
3.配置事务传播行为(propagation参数)
3.1什么是事务的传播行为?
事务传播行为: 指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。
3.2怎么设置传播参数?
传播参数的共分为7种
publicenumPropagation{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.注意事项
待补充