BaikalDB通过两个阶段提交协议(2PC),利用RocksDB的Pessimistic事务和Savepoint机制实现分布式事务。以下是对BaikalDB分布式事务实现的逐步介绍。当然,分布式事务非常复杂,BaikalDB分布式事务仍在迭代开发中。
协议(2PC)两个阶段提交
第二阶段提交协议(Two-phaseCommit,即2PC)是分布式事务原子提交的常用解决方案。它有一个协调者(coordinator)和多个参与者(participant),可以增加所有参与者都在分布式事务中提交事务或取消事务。
协调者的提交过程分为两个步骤:与参与者互动:
一:向所有参与者发送prepare请求,询问是否有可能提交。
二:如果所有参与者都回复YES,第二阶段的提交(commit)将发起真正的提交;如果任何参与者回复NO或超时没有响应,第二阶段将改为中止(abort)回滚前的操作。
实现BaikalDB
BaikalDB的分布式事务通过2PC+RocksDB的单机事务实现悲观事务。
一个事务执行通常包括BEGIN语句、一个或多个DML语句、COMMIT语句或ROLLBACK语句,BaikalDB为每个语句分配一个seq_id,seq_id单调持续增加。
seq_id=1对应BEGIN语句,将在BaikalDB缓存,并与个DML语句一起发送给BaikalStore,然后BEGIN语句将在BaikalStore创建一个RocksDBPessimistic事务,然后开始执行DML语句,同时BaikalStore将记录当前执行的DML语句的seq_id,用于事务幂等处理,COMMIT语句实际上分为PREPARE+COMMIT,将PREARE发送到各个region,返回成功,再发送COMMIT。