spring的事务的原理

前言:在java代码中我们经常使用@Transaction注解来表示已事务的方式运行。

@Transaction有两个很总要的属性:rollbackfor-----执行当发生什么异常的时候,回滚事物,propagation ------- 指明事务的传播特性,当出现多个事务方法调用的时候

例如事务a调用了事务b的时候,解决事务之间的特性问题

 

1. 什么叫做spring的事务

spring的事务其实就是数据库的事务,如果没有数据库的事务也就不存在spring的事务。

2. 数据的事务的隔离级别

读未提交、读以提交、可重复读、串行化读;

读未提交:在事务a读取的时候,读取到了事务b还为提交的数据,即脏读;

读已提交:在事务a进行多次读取的时候,事务b对数据库的中的数据进行了修改操作,导致事务a可能出现多次数据不一致的情况,即不可重复读;

可重复读:在事务a进行多次读取的时候,事务b进行了数据的增删操作,而事务a读取的仍然是事务b操作之前的数据;出现了幻境,即幻读;

序列化读:在事务操作的时候,锁定整张表,不让其他的数据进行操作,此种情况安全级别最高,但是在高并发的情况下影响效率;

3. spring的事务隔离级别

在数据库的四中隔离上增加了default级别

default级别是跟随数据库的隔离级别变化而变化,数据库采用什么隔离界别,spring就用什么隔离级别。

4. spring的事务的传播特性

什么叫做事务的传播特性?

首先是事务传播,事务传播即事务的传播,肯定是存在多个事务的情况并存在事务的传播的时候,才会出现的。

例如:方法a中使用了事务,方法b中也使用了事务;方法a调用了方法b,那么方法b的事务是在自己的事务中还是方法a的事务中?这种现象就叫做事务的传播

 

事务的传播特性分为7中:

required:支持当前事务,如果当前没有事务,则新建一个事务,当事务a和事务b如果发生异常的时候,都会回滚;这个是spring默认的事务隔离级别

supports:  支持当前事务,如果当前没有事务,则以非事务的方式运行;出现异常两者都不会回滚

required_new: 新建一个事物,如果当前存在事务,则将当前事务挂起,另外新起一个事务;事务b运行的时候会将事务a挂起,事务b运行完毕之后才会执行事务a,

此时如果事务a出现异常不会回滚事物b,因为事务b已经提交;如果在事务b执行的时候出现异常,事务a可以对其进行捕获选择进行回滚事务a还是继续执行

manatory:必须有事务,如果当前没有事务,则抛出异常

not support: 不支持当前事务、如果当前存在事务,则将当前事务挂起

never:不支持当前事务,如果当前存在事务,则抛出异常

nested:如果当前没有事务,则新建一个事物;如果当前存在事务,则将事务进行嵌套运行,在执行事务b之前,设置一个savepoint保存点,当事务b执行失败的时候,回滚事物b到

保存点;事务a可以继续向下运行事务c、d等。如果事务b没有执行失败,事务b也不会提交,需要等到外层的事务a执行完毕之后才会一块提交,如果事务a出现异常,会将事务b回滚

到保存点,同时事务a也回滚。

 

 

 

 

posted @ 2019-11-12 22:42  Java半路人生  阅读(1628)  评论(0编辑  收藏  举报