事务层
事务层实现了对并发操作的ACID事务支持。
-
CRDB事务分为两个阶段:
-
write & reads,即事务执行阶段,当进行写操作时,CRDB并不会直接对硬盘的数据进行修改,而是使用另外两个东西来进行辅助,这两个东西也避免了锁的使用:
-
-
Transaction record
,存储在range第一个被修改的key处,表明了修改当前key的事务所处的状态:PENDING
,COMMITTED
或者ABORTED
。第一个状态表示事务正在进行;第二个状态表示事务已经提交;第三个表示事务已经丢弃,正在进行重试或者rollback。
-
-
Write intents
,对数据的修改写在这里,此外还带一个指向transaction record的指针,来表明这些数据当前或者之前被一个事务修改过,其他事务根据这个状态来决定对这些数据的下一步操作。产生一个新的write intent前需要检查这一块数据有没有更晚时间戳的提交值,如果有的话该事务需要被重新开始。
当进行读操作时,会检查所读的每块数据的write intent,如果不存在,那么直接读以前的mvcc数据就行了,如果有write intent,那么需要判断intent的状态,根据状态做出下一步操作。
-
Commit,提交阶段,如果事务执行阶段没有问题,那么事务就可以直接进行提交,如果中途出现问题就会abort,然后进行重试或者rollback。
-
Cleanup,这个阶段不属于事务中,主要是用来解