为什么raft log都committed了。用户transaction还不能返回提交成功。写的操作不应该是在内存中有数据么?此时虽然没有apply到kv里面。但是应该在内存中应该可以读到了。那么就应该可以给客户端返回提交成功了吧?

你可能有这样一个疑问:
A 事务,update了一条,但是还没有commit,但是update后,在A事务中查询到的值是 update以后的值。
这时候,读取的数据肯定在内存里,所以为什么其他tidb节点读不到这个内存的内容?

因为:
A事务的prewrite请求涉及的key,是缓存在TIDB节点的。A事务的所有后续查询肯定持续的在同一个TIDB节点上。所以能直接读取内存获取到。

但是如果换成了B事务,调度到了另一个TIDB节点,那A事务数据缓存的这块内存在B事务的tidb节点是读不到的。

不理解这种解释,你说的这种现象。或者mvcc导致的。

要确保一致性

两阶段提交,可以看看101视频讲解的很详细

mvcc是A事务开始,B事务开始,A事务提交,B事务看不到变化。

我说的是 A事务开始,但是一直不提交,A事务还能看到自己的修改。这块内容是缓存在tidb客户端的。

没理解, transaction 是kv的组件。事务还没提交,外部组件的话 能感知到吗?有必要感知到吗?acid怎么保证?

1阶段提交的时候。修改没有缓存到tikv的内存中么?

事务是kv提供的,但是需要tikv-client配合。tikv-client是协调者。事务提交到tikv之前,都是tikv-client缓存的。
对于一个事务来说,自己修改的当然要自己能看到啊。其他tidb节点看不到很正常啊。

1阶段就直接提交了,也就是直接写入了tikv,还缓存个啥。