zoukankan      html  css  js  c++  java
  • spring事务详解(五)总结提高

    系列目录

    spring事务详解(一)初探事务

    spring事务详解(二)简单样例

    spring事务详解(三)源码详解

    spring事务详解(四)测试验证

    spring事务详解(五)总结提高

    一、概念

    事务的概念很多,只有对整体有一个把控,才能见微知著。比如一上来直接问REQUIRED,你一定很懵,但了解了大致关系后,就很清晰:Spring事务定义了六大属性-》其中一个属性是传播机制-》REQUIRED是其中一个,默认的传播机制。梳理出来三张图,如下:

    1.1 框架概览

    对于数据库事务,国际性认可的标准是ACID,即原子性、一致性、隔离性、持久性。Spring作为一个支持数据库持久化的框架,定义了六大属性来实现这四大特性。属性分别是:事务名称、隔离级别(4种)、超时时间、是否只读、传播机制(7种)、回滚机制。用户使用时定义其中的一种或几种,再结合Spring对底层数据库的驱动,即可实现ACID良好的数据库操作了。持久化层Spring提供了对Spring -Mybatis的很好的支持,可以轻松对接JDBC事务如下图:

     

    1.2 重点属性

    1. 四大隔离级别对应的可能出现的问题如下图:

    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序列化,数据库会成为瓶颈)。

    2. 七大传播机制概念图如下:

    二、源码风格

    这里我们主要看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 事务的使用有一定的掌握。

    四、不足

    本系列只讲解了单数据库的事务,后续会尝试分析分布式事务的实测。

  • 相关阅读:
    ES6 变量的解构赋值
    【js重学系列】new
    【js面试系列】手写常见js方法
    【js重学系列】this
    js-继承
    【js重学系列】数组高阶函数
    【js面试系列】数组去重
    云服务器部署项目-基本使用流程
    mongodb-基本使用
    移动端适配
  • 原文地址:https://www.cnblogs.com/dennyzhangdd/p/9602676.html
Copyright © 2011-2022 走看看