登录 注册 发布

小蜜蜂

fescar锁设计和隔离级别的理解



推荐
分支事务如何工作?关注全局锁的获取和释放 特别是二阶段commit和rollback全局锁释放的顺序



ATBranch.png
Fescar中 RM TM TC如何工作的?



AT distribute transaction.png
看了这两张图,大家应该对fescar是如何工作的应该有一个大致的了解了。☺
1、全局锁的获取
2、tm tc rm之间如何通信工作
3、隔离级别问题的思考
最后我们来解读一遍官方的demo
  • branch1:update storage_tbl set count = count - ? where commodity_code = ?
  • branch2:update account_tbl set money = money - ? where user_id = ?
  • branch3:insert into order_tbl (user_id, commodity_code, count, money) values (?, ?, ?, ?)
  1. 线程A:执行branch1(pk:55),执行branch2的时候发现没钱了,扔了一个异常,那么势必需要回滚branch1的份额。

    • TM通知TC开始回滚branch1份额中
  2. 线程B:执行branch1(pk:55)

    • 如果线程A中branch1(pk:55)已经回滚成功了,那么B线程可以正常拿到锁走下去
    • 如果线程A中branch1还未回滚(resourceId+table+pk锁未释放)。当线程B发起branch1向server发起申请锁,会直接失败。
Fescar全局锁简单总结:操作一条记录的分支事务,必须等待这条记录的前一个分支事务执行结束(具体commit rollback情况分析如下),才能持有锁。
其实相比XA的锁,fescar在每个分支事务的一阶段结束后都释放了db的锁,所以fescar的性能瓶颈应该在于二阶段的执行速度(释放锁的快慢)
因为分布式事务在执行事务编排前,一般会校验业务的正确性,所以发生回滚的概率相对较低,所以先考虑二阶段commit操作。
  1. Commit场景分析:

     TM通知server进行commit,server立马释 branch的锁,然后再逐个通知RM提交
     消耗:1 rpc操作,(branch删除undo_log放在异步队列里面做)
    
  2. Rollback场景分析:

     TM通知server进行rollback,server通知RM回滚后立马释放 branch的锁。
     消耗:1 + N的rpc操作 + N的回滚sql操作
    
所以总的来看fescar在commit的释放全局锁还是非常高效的。

思考

1. server支持多台机器部署,应该如何改造?

    全局锁的问题,锁改造;
    全局事务向server0申请的,Branch1发到server1branch2发到server2的问题,多机器恢复的情况,TC的改造

2. 全局锁在Fescar中更新确实是没有问题的,但是如果就是业务方需要手动调整DB数据呢?

    大胆猜测,依赖Fescar写了一个管理平台 用来执行sql的。哈哈

3. 隔离级别的思考
    Fescar默认工作在,本地事务读已提交,全局事务读未提交。
    是否存在全局事务必须工作在【读已提交】级别而不能工作在【读未提交】的业务场景呢?
    大家大胆脑洞 这个问题值得探讨。

4. Fescar的文档中说,是支持全局事务读已提交的,那么fescar是如何实现的呢?

   感兴趣的同学可以试着读一下com.alibaba.fescar.rm.datasource.exec.SelectForUpdateExecutor

源码核心类

大家想读源码的话,可以重点关注一下几个类。有问题一起探讨。

TM相关
com.alibaba.fescar.tm.api.TransactionalTemplate

RM相关
com.alibaba.fescar.rm.datasource.exec.SelectForUpdateExecutor
com.alibaba.fescar.rm.datasource.ConnectionProxy
com.alibaba.fescar.rm.datasource.exec.AbstractDMLBaseExecutor
com.alibaba.fescar.rm.RMHandlerAT

TC相关
com.alibaba.fescar.server.coordinator.DefaultCoordinator
com.alibaba.fescar.server.coordinator.DefaultCore
com.alibaba.fescar.server.lock.DefaultLockManagerImpl
36

评论