阿里的一个面试题:怎么保证spring事务内的连接唯一性

阿里二面的时候被问到的一个问题:

在spring的同一个事务内的多个方法,是怎么保证使用的是同一个数据库连接?原理是什么?涉及框架中的哪些类,具体作用是什么?举出几个例子。

阿里的一个面试题:怎么保证spring事务内的连接唯一性

 

最佳答案如下:

事务,是描述一组操作的抽象,比如对数据库的一组操作,要么全部成功,要么全部失败。

事务具有4个特性:

§ Atomicity(原子性)

§ Consistency(一致性)

§ Isolation(隔离性)

§ Durability(持久性)

事务是否生效取决数据库底层是否支持(比如MySQL的MyISAM引擎就不支持事务,Spring能奈何!),同时一个事务的多个操作需要在同一个Connection上。

事务也往往是在业务逻辑层来控制。

写一个得到数据库连接的管理类ConnectionManager

阿里的一个面试题:怎么保证spring事务内的连接唯一性

 

在Spring中,有时候我们是不是要配置多个数据源DataSource?

很显然,Spring需要通过DataSource来得到操作数据库的管道Connection。

这里通过ConnectionManager类来完成这个过程,需要思考的是在多线程下,这显然是存在问题的。

为避免多线程问题,难道我们采用线程安全的Map,比如ConcurrentHashMap,其实我们真正的目的是什么?

是保证一个线程下,一个事务的多个操作拿到的是一个Connection,显然使用ConcurrentHashMap根本无法保证!

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

阿里的一个面试题:怎么保证spring事务内的连接唯一性

本来线程不安全的,通过ThreadLocal这么封装一下,立刻就变成了线程的局部变量,不仅仅安全了。

还保证了一个线程下面的操作拿到的Connection是同一个对象!

这种思想,确实非常巧妙,这也是无锁编程思想的一种方式!

最后写一个TransactionManager,这样我们就可以管理事务了。

阿里的一个面试题:怎么保证spring事务内的连接唯一性

Java架构资料,获取方式

关注+转发后,私信回复关键词 【架构】即可获取以上价值1.8w的全套资料及视频

重要的话讲两遍,转发、转发后再发私信,才可以拿到哦!

转载于:https://my.oschina.net/u/3985214/blog/2963215

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值