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也回滚。