spring 如何保证数据库事务在同一个连接下执行的

ThreadLocal天生为解决相同变量的访问冲突问题, 所以这个对于spring的默认单例bean的多线程访问是一个完美的解决方案。spring也确实是用了ThreadLocal来处理多线程下相同变量并发的线程安全问题。

  • 要想实现jdbc事务, 就必须是在同一个连接对象中操作, 多个连接下事务就会不可控, 需要借助分布式事务完成。那spring 如何保证数据库事务在同一个连接下执行的呢?
  • DataSourceTransactionManager 是spring的数据源事务管理器, 它会在你调用getConnection()的时候从数据库连接池中获取一个connection, 然后将其与ThreadLocal绑定, 事务完成后解除绑定。这样就保证了事务在同一连接下完成。

事务开始阶段

public static void bindResource(Object key, Object value) throws IllegalStateException {
        Object actualKey = TransactionSynchronizationUtils.unwrapResourceIfNecessary(key);
        Assert.notNull(value, "Value must not be null");
        Map<Object, Object> map = resources.get();
        // set ThreadLocal Map if none found
        if (map == null) {
            map = new HashMap<>();
            resources.set(map);
        }
        Object oldValue = map.put(actualKey, value);
  • ThreadLocal存储的为DataSource生成的actualKey为key值和ConnectionHolder作为value值封装成的Map。
private static final ThreadLocal<Map<Object, Object>> resources =
            new NamedThreadLocal<>("Transactional resources");
  • 将 DBResource 和 ConnectionHolder分别作为KV存入 map
    Object oldValue = map.put(actualKey, value);

事务结束阶段

@Nullable
    private static Object doUnbindResource(Object actualKey) {
        Map<Object, Object> map = resources.get();
        if (map == null) {
            return null;
        }
        Object value = map.remove(actualKey);
        // Remove entire ThreadLocal if empty...
        if (map.isEmpty()) {
            resources.remove();
        }
  • 获取ThreadLocalMap
 resources.get();
  • 删除map 的Entry并移除
    Object value = map.remove(actualKey);
        // Remove entire ThreadLocal if empty...
        if (map.isEmpty()) {
            resources.remove();
        }

学习更多:
ThreadLocal 面试六连问,你能 Hold 住吗?
ThreadLocal-面试必问深度解析
Spring事务之如何保证同一个Connection对象

公众号"会讲历史的程序员",欢迎关注

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.数据库事务基础知识 1.1.何为数据库事务 数据库事务的4个特性 原子性:组成一个事务的多个数据库操作是一个不...
    小螺钉12138阅读 5,568评论 1 18
  • 什么是Spring的事务管理   在实际开发中,操作数据库时都会涉及到事务管理问题,为此Spring提供了专门用于...
    纸中圆阅读 5,173评论 0 0
  • 这部分主要是开源Java EE框架方面的内容,包括Hibernate、MyBatis、Spring、Spring ...
    杂货铺老板阅读 5,334评论 0 2
  • 枝桠在墙壁上翩翩起舞 人类擅长模仿,地上是奔跑的魂灵 一定要关闭房间的灯, 你的回声才够清脆,明亮。 此刻定有自由...
    粮食和花圈阅读 1,702评论 7 6
  • 不再把工作当做简单的重复,而是当做一种刻意练习,即使是同样的工作,每次都给自己提出不一样的要求,刻意的要求自己做的...
    赶驴阅读 2,187评论 0 0

友情链接更多精彩内容