作者回复: 👍,你比我回复得详细,顶起
作者回复: 应该是说,它迟早要commit,但是两个worker是两个线程,没办法约好“同时提交”,这样就有可能出现一个先提交一个后提交。
这两个提交之间的时间差,就能被用户看到“一半事务”,好问题
作者回复: 是有可能binlog event写入顺序不同的,好问题
作者回复: 准确👍
作者回复: 这几篇偏深,但确实是大家在使用的时候需要了解的,
到30篇后面的文章会偏应用哈
作者回复: 好问题
不过这个是不可能的哈,对同一行的修改,第一个拿到行锁的事务还没提交前,另外两个会被行锁堵住的,这两个进入不了commit状态。所以这三个的commit_id不会相同的😆
作者回复: 上面的描述部分,writeset的多线程复制流程里面,这段需要修改下:
『2.把binlog_cache flush到binlog文件中,根据表名、主键和唯一键(如果有)生成hash值(writeset),保存到hash表中
【判断这三个事务的writeset是否有冲突,如果没有冲突,则视为同组,如果有冲突,则视为不同组.
并把把组员编号以及组的编号写进binlog文件中】』
上面中括号这段要去掉,
判断writeset之间是否可以并行这个逻辑,是在备库的coordinator线程做的。
----
1. 在多线程并发的时候,Seconds_behind_master很不准,后面会介绍别的判断方法;
2. 是的,备库有记录,就是show slave status 里面的Relay_Log_File 和 Relay_Log_Pos 这两个值表示的,好问题
3. ”加入到组是在binlog cache flush到binlog文件之前做的,如果此时有事务正在flush,未sync,则后面的事务必须等待“ 这句话是对的,但是我没看出这个跟前面提的两个延迟参数作用的关系^_^
作者回复: 👍
作者回复: 主要还是从库的apply线程不够快。。
作者回复: 进入prepare 的时候就给这个事务分配 commitid,这个commitid就是当前系统最大的一个commitid
作者回复: 事务提交的时候
作者回复: 看完分享你的心得哈 👍
作者回复: serializable隔离级别确实用得很少(我没有见过在生产上使用的哈)
作者回复: 这里没有矛盾哈。图6中,画在同一组的,就表示可以并行执行。也就是说,图6中,123是并行执行,然后456并行,然后789并行
作者回复: 一个事务只能发给一个worker的,
长杰评论的那个问题,讨论的是如果分成两个事务,然后约定一起提交,这个是做不到的(或者说实现起来很复杂)