OceanBase开源,11张图带你了解分布式数据库的核心知识( 三 )


5.2 Prewrite事务管理器向两个分片发送了Prepare请求,分片收到请求后,为每个要修改的数据行写日志,并且根据时间戳记录事务的私有版本,这里的私有版本就是7,这样就获得了锁,其他事务就不能操作这两条数据了 。
如下图:

OceanBase开源,11张图带你了解分布式数据库的核心知识

文章插图
 
从第二列的数据可以看到,账户1上减少了200元,账户2上增加600元 。从第三列可以看到账户1获得了primary lock,账户2上是指向primary lock的锁指针 。
注意:primary lock的选择是随机的,账户1和账户2都可以选择 。
5.3 commitcommit阶段,协调节点只需要跟拥有primary lock的分片进行通信,这里只需要跟账户1进行通信,从而保证了commit指令的原子性 。这时数据如下表:
OceanBase开源,11张图带你了解分布式数据库的核心知识

文章插图
 
可以看到账户1的primary lock已经清除了,同时增加了8这个版本,8这个版本的数据指向版本7 。这样7、8两个版本都不是私有版本了,其他事务就可以操作这条记录了 。
私有版本还有一个作用,就是账户1提交失败后,账户2可以根据私有版本进行回滚 。
5.4 事务结束commit成功后并没有同步清除账户2上的私有版本和锁指针,而是会启动异步线程来清除,异步线程清除完成后,最终数据如下图:
OceanBase开源,11张图带你了解分布式数据库的核心知识

文章插图
 
可以看到,最终账户2清除了锁指针和私有版本 。
账户2上的lock没有同步清除,其他线程读取账户2时会根据primary@order.bal查找primary lock,如果发现primary lock已经清除,就可以继续读取 。读取的同时做一下secondary lock清理工作 。
6 总结本文主要从5个方面入手讲了分布式数据库的关键知识,欢迎大家批评指正 。




推荐阅读