zoukankan      html  css  js  c++  java
  • Spring事务设计思想

    写一个Demo来分析Spring事务底层到底是如何帮助我们轻松完成事务管理的!

    透彻理解Spring事务设计思想之手写实现

    先来看一眼工程结构:

    工程结构

    ConnectionHolder

    在Spring中,有时候我们是不是要配置多个数据源DataSource?很显然,Spring需要通过DataSource来得到操作数据库的管道Connection,这有点类似于JNDI查找。

    这里通过ConnectionHolder类来完成这个过程,需要思考的是在多线程下,这显然是存在问题的。为避免多线程问题,难道我们采用线程安全的Map,比如ConcurrentHashMap,其实我们真正的目的是什么?是保证一个线程下,一个事务的多个操作拿到的是一个Connection,显然使用ConcurrentHashMap根本无法保证!www.twitterchina.net

    Spring很聪明,她提供了一种思路,来解决,看下面的代码!

    SingleThreadConnectionHolder

    本来线程不安全的,通过ThreadLocal这么封装一下,立刻就变成了线程的局部变量,不仅仅安全了,还保证了一个线程下面的操作拿到的Connection是同一个对象!这种思想,确实非常巧妙,这也是无锁编程思想的一种方式!

    TransactionManager

    TransactionManager,这个我们经常在Spring里面进行配置吧,事务大管家!

    UserAccountDao、UserOrderDao

    UserAccountDao

    UserOrderDao

    这里通过这2个DAO,想模拟一个事务中账户购买、下单2个操作。

    UserService

    到这里,可以清晰的看到Spring事务管理的一个缩影了吧!

    Test

    测试

    这里,主要是模拟Spring的注入以及多用户并发请求。

    运行结果

    你可以发现,一个线程中的一个事务的多个操作,使用的是同一个Connection!

  • 相关阅读:
    生成数据库结构设计说明书的存储过程
    C#检测上传图片是否安全函数
    设定下拉列表控件DropDownList,复选按钮CheckBox,RadioButton默认值总结测试
    C#批量重命名工具V2.0
    个人一些工作经验方式积累办法
    修身《孟子》尽心篇
    linux 命令 lspci lsusb
    重拾信心
    linux eclipse
    A lunch in Gordon Market with WWF
  • 原文地址:https://www.cnblogs.com/mortre/p/7339292.html
Copyright © 2011-2022 走看看