事务的四种隔离级别
- 读未提交
读到别人尚未提交的代码,如果别人回滚了数据,可能会造成脏读
- 读已提交
读取别人已提交的代码,可能会造成不可重复读,即第一次读到了数据,期间有人再次提交数据,再次读取数据就和第一次不一样了
- 可重复读
在一个事务中,读取的数据始终是一致的,可能会造成幻读
- 串行读
同一个类中方法互调,被调用的方法不会被动态代理,因此造成事务的失效
在spring中,默认的隔离级别是可重复读
事务的传播机制
仅简单介绍以下常用的两个传播机制
- REQUEIRED
如果没有事务,就创建一个事务;如果有事务,就加入当前事务,加入当前事务后,该事务注解的其他设置会被当前事务覆盖
- REQUIRES_NEW
创建一个新的事务
解决办法
使用aspectJ来解决
- 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
- 在启动类上添加注解,开启aspectj动态代理功能。以后所有的动态代理都是aspectj对外暴露代理对象
@EnableAspectJAutoProxy(exposeProxy = true)
- 本类互调
AService aService = (AService)AopContext.currentProxy();
//注:b、c都是事务方法
aService.b();
aService.c();