AT模式写隔离

当我们看到上面的图的时候可能不太明白这个具体是怎么做的,所以今天就来源码看下。
首先是获取全局锁,那这个到底是什么锁呢,我们来看TA模式的ConnectionProxy的processGlobalTransactionCommit方法:

注册的时候会去注册锁,其实有点像分布式锁,谁先注册了谁就占着了,然后其他的就要重试:

其实这把锁哪里来的,就是在准备回滚日志的时候生成的,表名_主键ID:

如果发现注册有锁冲突,说明已经被别人抢到锁了,回头就抛recognizeLockKeyConflictException异常:

这个异常一直抛出去,直到外面有捕获的,睡眠一定时间重试,直到超时抛出LockWaitTimeoutException异常:

然后服务端提交后会释放锁,具体可以看服务端代码,这个就不细说了:

现在应该能大致看明白那个图了把,其实就是谁先注册谁就获得锁,然后做事务,提交了才会释放锁,如果注册发现有锁了,就只能不断的尝试,直到能注册位置,这样就进行了写隔离,同一时刻就只能有一个事务对同一个数据进行修改。
AT模式读隔离

这张图说的是读隔离,默认的是读未提交,如果要进行读已提交的话也可以用全局锁:
在sql中有SELECT FOR UPDATE语句,执行器就是SelectForUpdateExecutor,可以看到查询的时候会检查全局锁,不能获得就会重试:

最低0.47元/天 解锁文章
2305





