06
2020
05

spring事务的实现及其原理

Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。


(1)Spring事务的种类:


spring支持编程式事务管理和声明式事务管理两种方式:


①编程式事务管理使用TransactionTemplate。


②声明式事务管理建立在AOP之上的。其本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。


声明式事务最大的优点就是不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明或通过@Transactional注解的方式,便可以将事务规则应用到业务逻辑中。


声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开发方式,使业务代码不受污染,只要加上注解就可以获得完全的事务支持。唯一不足地方是,最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。


(2)spring的事务传播行为:


spring事务的传播行为说的是,当多个事务同时存在的时候,spring如何处理这些事务的行为。


① PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。


② PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。‘


③ PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。


④ PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。


⑤ PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。


⑥ PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。


⑦ PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。


(3)Spring中的隔离级别:


① ISOLATION_DEFAULT:这是个 PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别。


② ISOLATION_READ_UNCOMMITTED:读未提交,允许另外一个事务可以看到这个事务未提交的数据。


③ ISOLATION_READ_COMMITTED:读已提交,保证一个事务修改的数据提交后才能被另一事务读取,而且能看到该事务对已有记录的更新。解决脏读问题


④ ISOLATION_REPEATABLE_READ:可重复读,保证一个事务修改的数据提交后才能被另一事务读取,但是不能看到该事务对已有记录的更新。行锁


⑤ ISOLATION_SERIALIZABLE:一个事务在执行的过程中完全看不到其他事务对数据库所做的更新。表锁


(3)只读属性(readOnly)


false应用在查询操作时,提高查询效率, true用于查询,false用于增删改,默认是false


(4)超时属性(timeout) 秒 -1 由数据库决定


如果当前事务操作的数据,被别的事务锁住,那么通过超时数据指定最多等待多少秒.


(5)异常属性(+-Exception)


        默认Spring会对RuntimeException及其子类进行回滚操作

        默认Spring会对Exception及其子类进行提交操作

        rollback-for=”异常的权限定名” 回滚操作

        no-rollback-for=”java.lang.RuntimeException” 提交操作


简单展示



c7dbd5652145b9b106ebfe8f62d9b269.jpg

« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。