5.2 Prewrite事务管理器向两个分片发送了Prepare请求,分片收到请求后,为每个要修改的数据行写日志,并且根据时间戳记录事务的私有版本,这里的私有版本就是7,这样就获得了锁,其他事务就不能操作这两条数据了 。
如下图:
文章插图
从第二列的数据可以看到,账户1上减少了200元,账户2上增加600元 。从第三列可以看到账户1获得了primary lock,账户2上是指向primary lock的锁指针 。
注意:primary lock的选择是随机的,账户1和账户2都可以选择 。5.3 commitcommit阶段,协调节点只需要跟拥有primary lock的分片进行通信,这里只需要跟账户1进行通信,从而保证了commit指令的原子性 。这时数据如下表:
文章插图
可以看到账户1的primary lock已经清除了,同时增加了8这个版本,8这个版本的数据指向版本7 。这样7、8两个版本都不是私有版本了,其他事务就可以操作这条记录了 。
私有版本还有一个作用,就是账户1提交失败后,账户2可以根据私有版本进行回滚 。5.4 事务结束commit成功后并没有同步清除账户2上的私有版本和锁指针,而是会启动异步线程来清除,异步线程清除完成后,最终数据如下图:
文章插图
可以看到,最终账户2清除了锁指针和私有版本 。
账户2上的lock没有同步清除,其他线程读取账户2时会根据primary@order.bal查找primary lock,如果发现primary lock已经清除,就可以继续读取 。读取的同时做一下secondary lock清理工作 。6 总结本文主要从5个方面入手讲了分布式数据库的关键知识,欢迎大家批评指正 。
推荐阅读
- 常用开源协议对比
- VLC Media Player:最棒的开源播放器
- Bootstrap5.0-全球流行的前端开源UI工具包迎来了大版本更新
- Cumulus Linux 开源交换系统
- openscap 免费开源的扫描工具
- 阿里开源的限流神器 Sentinel,轻松搞定接口限流
- 可视化Kafka
- 11 个可以部署在 Linux 服务器上的开源论坛软件
- 开源:API文档汇总管理工具Swagger Butler
- 值得现在就去尝试的四款开源聊天应用软件