简述Spring事务的原理机制。
Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。
Spring只提供统一事务管理接口,具体实现都是由各数据库自己实现,数据库事务的提交和回滚是通过 redo log 和 undo log实现的,
Spring会在事务开始时,根据当前环境中设置的隔离级别,调整数据库隔离级别,由此保持一致。
=========================================================================================
(1)在要开启事务的方法上加@Transactional注解;
(2)此时Spring就会使用AOP的思想,对你的这个方法在执行之前,先去开启事务,执行完毕之后根据方法是否报错,决定回滚或者提交事务。
Spring 事务什么时候会失效?
Spring 事务的原理是AOP,进行切面增强,那么失效的根本原因是AOP不起作用,情况有如下几种:
发生自调用:类里面使用this对象调用本类的方法,此时this对象不是代理对象,解决方法:让this 变成代理对象
方法不是public的:@Transactional 只能用于public方法,如果是非public方法,可以开始aspectJ代理模式
数据库不支持事务
没有被spring管理
异常被吃掉,事务不会回滚或者抛出的异常没有被定义,默认为RuntimeException
Spring事务的种类
spring支持编程式事务管理和声明式事务管理两种方式:
编程式事务管理使用TransactionTemplate。
声明式事务管理建立在AOP之上的。其本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前启动一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
声明式事务最大的优点就是不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明或通过@Transactional注解的方式,便可以将事务规则应用到业务逻辑中,减少业务代码的污染。
描述事务的各传播机制及原理
TransactionDefinition.PROPAGATION_REQUIRED
当前如果有事务,Spring就会使用该事务;否则会开始一个新事务
TransactionDefinition.PROPAGATION_SUPPORTS
当前如果有事务,Spring就会使用该事务;否则不会开始一个新事务
TransactionDefinition.PROPAGATION_MANDATORY
当前如果有事务,Spring就会使用该事务;否则会抛出异常
TransactionDefinition.PROPAGATION_REQUIRES_NEW
Spring总是开始一个新事务。如果当前有事务,则该事务挂起
TransactionDefinition.PROPAGATION_NOT_SUPPORTED
Spring不会执行事务中的代码。代码总是在非事务环境下执行,如果当前有事务,则该事务挂起
TransactionDefinition. PROPAGATION_NEVER
即使当前有事务,Spring也会在非事务环境下执行。如果当前有事务,则抛出异常
TransactionDefinition. PROPAGATION_NESTED
如果当前有事务,则在嵌套事务中执行。如果没有,那么执行情况与Transaction- Definition.PROPAGATION_REQUIRED一样
上一篇:莱万多夫斯基vs瓦伦西亚全场数据:3进球 莱万多夫斯基vs本泽马 莱万多夫斯基vs梅西
下一篇:最新!关于义务教育入学信息采集,市教委提醒|附信息采集流程及各区咨询电话 小学入学信息采集需要什么 义务教育阶段入学如何在网上登记