请帮忙解析为何有读写冲突呢?

version : 4.0.10

请问,为何二阶段会有读写冲突呢? 为何第一步需要去lock 检查锁情况,不直接到write 读取最新数据呢?

https://docs.pingcap.com/zh/tidb/stable/troubleshoot-lock-conflicts
这个文档中有说明,看下有帮助么

是的,我没明白为何读取需要去判断txn0的事务是否写成功。

难道读取的read_ts 必须一定要读取先以它发起事务(该事务必须已经完成的),不然就会读写冲突? 那么这是为啥呢?

这是为了实现事务隔离级别:https://andremouche.github.io/tidb/transaction_in_tidb.html

不太明白,能解析下吗?

不明白的点是什么点不明白?
解析的话,也是官方文档内容的说明。

key 上有锁说明事务还没有提交,如果读取到了还没有提交的事务,那不就是脏读了么。

读取数据应该是从write列获取小于读start_ts的对应的最新版本吧 。
在事务未到达commit 阶段不是都没写write 列吗? 那么就不会获取到未提交的数据。

是的,我是没理解以下这段话。能帮忙举个简单例子(如果读 write ts< 读start_ts 是幻读 )?

image

事务提交的时候,在 prewrite 阶段就已经将数据写入到 data 列了的。

:+1:
我将tso想粗了。
类似以下场景就会出现不可重复读和幻读了

:+1::+1: