Spring系列之 (十二):Spring事务机制详解


Spring系列之 (十二):Spring事务机制详解

1. Spring的事务管理机制

Spring事务管理高层抽象主要包括3个接口,Spring的事务主要是由他们共同完成的:
1.PlatformTransactionManager:事务管理器—主要用于平台相关事务的管理
2.TransactionDefinition:事务定义信息(隔离、传播、超时、只读)—通过配置如何进行事务管理。
3.TransactionStatus:事务具体运行状态—事务管理过程中,每个时间点事务的状态信息。

 

1.PlatformTransactionManager:事务平台管理器

spring管理事务时,必须使用平台事务管理器,它是一个接口,相当于定义一个spring使用事务的规范,也就是如果你想用spring来帮你管理事务,那么就必须遵循这个规范,spring也帮我们实现了一些常用的技术所需要的管理器,比如,jdbc有jdbc管理器,hibernate有hibernate管理器,他们都是实现spring中的PlatformTransactionManager接口的

              Spring系列之 (十二):Spring事务机制详解

1.jdbc事务管理器:DataSourceTransactionManager

 hibernate事务管理器:HibernateTransactionManager

 PlatformTransactionManager是一个接口,那我们看它定义了哪些方法供我们使用的。

              Spring系列之 (十二):Spring事务机制详解    

  TransactionStatus getTransaction(TransactionDefinition);

  获取事务,参数TransactionDefinition(事务详情),该参数是需要我们配置的,通过我们配置的内容才能知道事务如何去处理。这个下面会详解

  commit(TransactionStatus);根据状态来提交事务的操作

  rollback(TransactionStatus);根据状态来回滚事务的操作

 

2.TransactionStatus:事务具体运行状态

spring使用管理器,通过状态对事务进行管理(操作),我们不必关心这个,因为这是spring内部操作的事情,但是我们可以了解一下有哪些方法

              Spring系列之 (十二):Spring事务机制详解

3.TransactionDefinition:事务定义信息

spring管理器必须通过"事务详情"的设置,获取相应的事务,从而进行事务管理。这里这个很重要,我们需要配置这个

               Spring系列之 (十二):Spring事务机制详解

1.设置4个隔离级别就不用说了把,跟上面我们说的是一样的。解决隔离问题的四种级别。

隔离级别:隔离级别定义了一个事务可能受其他并发事务影响的程度

事务特性(ACID)

1.原子性(atomicity):将事务中所做的操作捆绑成一个原子单元,即对于事务所进行的数据修改等操作,要么全部执行,要么全部不执行。

2.一致性(Consistency):事务在完成时,必须使所有的数据都保持一致状态,而且在相关数据中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构都应该是正确的。

3.隔离性(Isolation):由并发事务所做的修改必须与任何其他事务所做的修改相隔离。事务查看数据时数据所处的状态,要么是被另一并发事务修改之前的状态,要么是被另一并发事务修改之后的状态,即事务不会查看由另一个并发事务正在修改的数据。这种隔离方式也叫可串行性。

4.持久性(Durability):事务完成之后,它对系统的影响是永久的,即使出现系统故障也是如此。

在企业级应用中,多用户访问数据库是常见的场景,这就是所谓的事务的并发。事务并发所可能存在的问题: 
1.脏读:一个事务读到另一个事务未提交的更新数据。 
2.不可重复读:一个事务两次读同一行数据,可是这两次读到的数据不一样。 
3.幻读:一个事务执行两次查询,但第二次查询比第一次查询多出了一些数据行。 
4.丢失更新:撤消一个事务时,把其它事务已提交的更新的数据覆盖了。

4种隔离级别:

1.TRANSACTION_READ_UNCOMMITTED :已读未提交,允许脏读、不可重复读和幻读。 
2.TRANSACTION_READ_COMMITTED :已读已提交,禁止脏读,但允许不可重复读和幻读。 
3.TRANSACTION_REPEATABLE_READ:可重复读, 禁止脏读和不可重复读,单运行幻读。 
4.TRANSACTION_SERIALIZABLE :可串行/序列化,禁止脏读、不可重复读和幻读。


2.播行为(PropagationBehavior)
一个业务A,一个业务B,AB如何共享事务,不同传播行为共享方案不同
当事务方法被另一个事务方法调用时,必须指定事务应该如何传播 

解释:什么意思呢?比如业务A为银行转账的业务。 业务B为转完账发短信的业务,平常我们是转完钱,那么我们就需要收到短信说我们的账户上被转走多少钱,而收钱的那一方则需要收到短信说账户被转进多少钱,那么这两个业务是使用同一个事务呢?还是分别使用不同的事务,也就是如果是使用同一个事务的话,我们转钱成功了代表业务A成功了,但是业务B发送短信时出现问题,则说明该事务失败,那么刚才转的钱就算不成功,需要回滚,但是实际生活中,是不能这样的,转钱成功了,短信没发送成功,那么短信在重新发送一次即可。不需要让业务A重新在操作一遍。这就是业务A和业务B共享事务的解决方法,让他们两个使用各自的事务。而传播行为就是提供这样的共享方案的属性。

传播行为的类型               

1.PROPAGATION_REQUIRED ,required ,必须使用事务  (默认值)

 支持当前事务,如果不存在 就新建一个

2.PROPAGATION_SUPPORTS,supports ,支持事务

 支持当前事务,如果不存在,就不使用事务

3.PROPAGATION_MANDATORY,mandatory 强制

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

4.PROPAGATION_REQUIRES_NEW , requires_new ,必须是新事务

 如果有事务存在,挂起当前事务,创建一个新的事务,没有也新建个事务

5.PROPAGATION_NOT_SUPPORTED ,not_supported 不支持事务

 以非事务方式运行,如果有事务存在,挂起当前事务

6.PROPAGATION_NEVER,never 从不使用

 以非事务方式运行,如果有事务存在,抛出异常

7.PROPAGATION_NESTED nested 嵌套

 如果当前事务存在,则嵌套事务执行只对DataSourceTransactionManager 起效

 掌握:PROPAGATION_REQUIREDPROPAGATION_REQUIRES_NEWPROPAGATION_NESTED


总结

spring事务编程的步骤

1、确定管理器

2、必须配置事务详情(是否只读,隔离级别,传播行为等)

配置好了事务详情,也确定了使用哪个管理器,那么spring就知道如何对事务进行怎样的处理了。