事务复习1-理论基础

事务复习基础

  • 事务
    • 特性
    • 隔离级别
    • 传播行为Propagation
    • 失效情况

事务

特性

1.一致性
2.隔离性
3.持久性
4.原子性

隔离级别

1.读已提交
读取其他事务已经提交的数据
2.读未提交
读取其他事务还未提交的数据–可能出现脏读
3.可重复读
同一个事务多次读取同一个数据,尽可能的保证数据的一致性但是可能出现幻读
4.串行读
确保每个事务读取的都是最新的数据,但是他的并发是最低的

隔离级别 脏读 不可重复读 幻读
读已提交
读未提交
可重复读
串行读

传播行为Propagation

1.REQUIRED(有就加入,没有就开)
如果当前没有事务,就会新建一个事务,如果当前已经存在一个事务就会加入到这个事务中,这个是默认的事务传播机制
2.SUPPORTS(有就加入,没有就不开)
如果当前存在事务,则会加入事务,如果当前没有事务则是以非事务的方式继续进行
3.MANDATORY(有就加入,没有就抛出异常)
如果当前存在事务,则会加入事务,如果当前没有事务则抛出异常
4.REQUIRES_NEW(必须开启一个事务,不管有没有都会开一个新的事务)
表示创建一个新的事务,如果对当前存在事务,则把当前的事务挂起,也就是说不管外部方法是否开启事务,这里的内部方法都是会开启新的事务,并且开启的事务之间都是相互独立的互不干扰
5.NOT_SUPPORTED(有就挂起)
以非事务进行运行,如果当前存在事务就将当前的事务进行挂起
6.NEVER(有就抛出异常)
以非事务进行运行,如果当前存在事务则会抛出异常
7.NESTED
嵌套事务,如果调用方法已经有了一个事务,那么当前的方法将会嵌套再该事务中执行,如果当前调用的方法没有事务,那么当前的方法将会开启一个新的事务

失效情况

1.spring事务会在除了使用公共的public的方法上使用的时候会失效
2.如果方法是被fina或者staticl进行修饰的时候也是导致事务的失效的,原因是事务使用的是动态代理进行实现的如果使用了final进行修饰的时候就会导致事务里面的动态代理无法进行重写导致事务的失效
3.如果被try catch捕获或者报错被抛出的时候也是会导致事务的失效的’’
4. 多线程调用的时候也是会导致事务的失效,原因是spring的事务是和数据库进行连接的,同一个事务只能使用同一个数据库的连接,再多线程的场景下拿到的数据库的连接是不一样的所以不支持事务
5.使用了错误的传播行为例如Propagation.NOT_SUPPORTED也是不支持事务的
6.使用的是不支持事务的存储引擎,例如使用的是mysql的MyISAM
7.数据源没有进行配置事务管理器-----但是springboot框架里面使用的是默认开启了事务
8.调用的是本类的方法也是会导致事务的失效,主要是因为spring的事务是通过aop进行实现的,调用的本类的方法实际上是没有走代理的,所以无法进行增强也就是无法使用事务
9.service没有托管给spring也就是不是spring的bean所以也是会导致事务的失效

案例:后续进行补充

解决方法:

1.非public方法
1). 将方法改为public进行修饰
2). 修改TansactionAttributeSource,将publicMethodsOnly改为false


2.调用本类方法 解决方法:
1). 注入自己来进行调用
2). 使用@EnableAspectJAutoProxy(exposeProxy = true) + AopContext.currentProxy()

你可能感兴趣的:(事务)