美文网首页IT 架构师
数据库读写分离与事务纠缠的那点坑

数据库读写分离与事务纠缠的那点坑

作者: LinkedKeeper | 来源:发表于2017-11-03 16:56 被阅读15次

    本篇文章讨论在数据库读写分离时使用事务的那些坑:

    1. 在读写分离时会不会造成事务主从切换错误

    一个线程在Serivcie时Select时选择的是从库,DynamicDataSourceHolder中ThreadLocal对应线程存储的是slave,然后调用Manager时进入事务,事务使用默认的transacatinManager关联的dataSource,而此时会不会获取到的是slave?

    在读写分离时会不会造成事务主从切换错误

    经验证不会,但这是因为在AOP设置动态织出的时候,都要清空DynamicDataSourceHolder的ThreadLocal,如此避免了数据库事务传播行为影响的主从切换错误。如果Selelct DB从库完成之后不清空ThreadLocal,那么ThreadLocal跟线程绑定就会传播到Transaction,造成事务操作从库异常。而清空ThreadLocal之后,Spring的事务拦截先于动态数据源的判断,所以事务会切换成主库,即使事务中再有查询从库的操作,也不会造成主库事务异常。

    2. 事务隔离级别和传播特性会不会影响数据连接池死锁

    一个线程在Service层Select数据会从数据库获取一个Connection,通常来讲,后续DB的操作在同一线线程会复用这个DB Connection,但是从Service进入Manager的事务后,Get Seq获取全局唯一标识,所以Get Seq一般都会开启新的事物从DB Pool里重新获取一个新连接进行操作,但是问题是如果两个事务关联的datasource是同一个,即DB Pool是同一个,那么如果DB Pool已经为空,是否会造成死锁?

    事务隔离级别和传播特性会不会影响数据连接池死锁

    经验证会死锁,所以在实践过程中,如果有此实现,建议Get Seq不要使用与事务同一个连接池。或者采用事务隔离级别设置PROPAGATION_REQUIRES_NEW进行处理。最优的实践是宎把Get SeqId放到事务里处理。

    总结

    分析的不是很深,有很多地方还不是特别了解,欢迎吐槽相互学习,尤其是说错了的地方,一定请帮忙指正,以免误人子弟。

    原文地址:http://www.linkedkeeper.com/detail/blog.action?bid=1043

    本文受原创保护,未经作者授权,禁止转载。 linkedkeeper.com (文/张松然)

    相关文章

      网友评论

        本文标题: 数据库读写分离与事务纠缠的那点坑

        本文链接:https://www.haomeiwen.com/subject/ixntmxtx.html