Spring事务的实现方式和原理以及隔离级别?
在使用spring的时候,事务有两种形式,一种是编程式,一种是声明式。@Transactional就是声明式事务。
首先,事务的概念是数据库层面的,spring只是基于此进行了扩展。
在一个方法上加了@Transactional注解后,会将这个代理对象做为bean,当在使用这个代理对象作为方法时,如果这个方法存在了@Transactional注解,那么代理对象会先把
事务的自动提交设置为false,然后再去执行原本的业务逻辑方法,如果执行业务逻辑方法没有出现异常,那么代理逻辑中就会将事务进行提交,如果出现了异常就会回滚。
spring的事务隔离级别就是数据库的隔离级别:外加一个默认等级。
read uncommitted 未提交读
read commit 提交读,不可重复读。
repeatable read 可重复读。
seriallizable 可串行化
spring 事务的传播机制
保证同一个事务中
PORPAGATION_REQUIRED:支持当前事务,如果不存在 就新建一个(默认)
PROPAGATION_SUPPORTS:支持当前事务,如果不存在,就不使用事务
PROPAGATION_MANDATORY:支持当前事务,如果不存在,抛出异常
* 保证没有在同一个事务中
PROPAGATION_REQUIRES_NEW:如果有事务存在,挂起当前事务,创建一个新的事务
PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果有事务存在,挂起当前事务
PROPAGATION_NEVER:以非事务方式运行,如果有事务存在,抛出异常
PROPAGATION_NESTED:如果当前事务存在,则嵌套事务执行