发布网友 发布时间:2024-09-07 06:11
共1个回答
热心网友 时间:2024-09-07 11:13
1.开启事务在Spring启动类中添加@EnableTransactionManagement可开启事务功能,默认已开启。
@SpringBootApplication@EnableTransactionManagement(显式开启事务,SpringBoot默认开启,可省略)publicclassEmosWxApiApplication{publicstaticvoidmain(String[]args){SpringApplication.run(EmosWxApiApplication.class,args);}}2.配置事务隔离等级(isolation参数)2.1什么是事务隔离等级?有什么作用?事务的隔离分为四个等级:RU(ReadUncommitted)、RC(ReadCommitted)、RR(RepeatableRead)、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.1REQUIRED执行被修饰的方法时,如果有事务上下文则加入该事物,如果没有则新开启一个事务。
3.2.2SUPPORTS执行被修饰的方法时,如果存在事务上下文,则加入该事务,如果没有则非事务地执行。
3.2.3MANDATORY执行被修饰的方法时,如果存在事务上下文,则加入该事务,如果没有则抛出异常thrownewIllegalTransactionStateException(“Transactionpropagation‘mandatory’butnoexistingtransactionfound”);
3.2.4REQUIRES_NEWA执行被修饰的方法B时,先把调用者事务A挂起,再执行完被修饰的事务B后,再执行A,A事务是否成功提交不影响B事务。如果事务A发生回滚也不会影响到事务B的提交。
3.2.5NOT_SUPPORTED总是非事务地执行,并挂起任何存在的事务。
3.2.6NEVER总是非事务性地执行,如果存在一个活动的事务则抛出异常。
3.2.7NESTED也是嵌套模式,类似于REQUIRES_NEW,事务A调用B方法,则A挂起,先执行B,执行完了在恢复执行A,但是有一点不同,A如果执行失败回滚了会导致内层的B也回滚,但是B如果执行失败了并不会导致外层的A回滚。如果调用B方法的A方法不存在事务,则B等于是REQUIRED。
4.配置只读(read-only)@Transactional(isolation=Isolation.DEFAULT)
5.注意事项待补充