spring事务详解(二)简单样例spring
事务的概念不少,只有对总体有一个把控,才能见微知著。好比一上来直接问REQUIRED,你必定很懵,但了解了大体关系后,就很清晰:Spring事务定义了六大属性-》其中一个属性是传播机制-》REQUIRED是其中一个,默认的传播机制。梳理出来三张图,以下:设计模式
对于数据库事务,国际性承认的标准是ACID,即原子性、一致性、隔离性、持久性。Spring做为一个支持数据库持久化的框架,定义了六大属性来实现这四大特性。属性分别是:事务名称、隔离级别(4种)、超时时间、是否只读、传播机制(7种)、回滚机制。用户使用时定义其中的一种或几种,再结合Spring对底层数据库的驱动,便可实现ACID良好的数据库操做了。持久化层Spring提供了对Spring -Mybatis的很好的支持,能够轻松对接JDBC事务以下图:并发
Read Uncommitted < Read Committed < Repeatable Read < Serializable. 从左往右:一致性愈来愈强,性能愈来愈低。框架
Repeatable Read(一致性3星,性能2星)> Read Committed(一致性2星,性能3星) > Read Uncommitted(一致性1星,性能4星) > Serializable(一致性4星,性能1星)。分布式
高并发场景使用Read Committed,低并发场景使用Repeatable Read。其它两个没用过(Read Uncommitted一致性过低了;Serializable sql序列化,数据库会成为瓶颈)。高并发
这里咱们主要看Juergen Hoeller的源码风格,发现他很好的遵循了Spring的一向风格:
1.预留方法给customer本身定义扩充,Spring一向喜欢预留各类后门...
2.利用各类设计模式:
1)template模板模式:构造事务模板,编程式事务源码
2)代理模式:生成加强代理类,声明式事务源码
3. Spring-AOP MethodInterceptor方法拦截器:申明式事务中使用TransactionInterceptor事务拦截器,该类实现了MethodInterceptor接口,继承自Interceptor接口,最终在业务方法invoke()先后进行加强。
4. 面向接口编程,高度抽象:PlatformTransactionManager接口定义getTransaction、commit、rollback。AbstractPlatformTransactionManager抽象类实现通用的获取事务、提交事务、回滚事务。DataSourceTransactionManager继承抽象类,并实现特性接口。
固然看过spring transaction包,除了Spring的一向风格外,最大的体会是注释丰富,日志丰富(尤为是debug,甚至不须要debug光看日志就能够清晰知道核心流程)。勉之。
本系列针对Spring+Mybatis+Mysql,讲解了2种典型的事务的实现方案(数据库事务采用DataSourceTransactionManager来管理事务,支持JDBC驱动,经过Connection和数据库进行交互。):
1.编程式事务
2.申明式事务
并测试了4种隔离级别和7种传播机制。相信经过实测,你们对spring 事务的使用有必定的掌握。
本系列只讲解了单数据库的事务,后续会尝试分析分布式事务的实测。