2PC(2 阶段提交)和 2 PL(2 阶段锁定)之间的区别

use*_*855 5 database distributed paxos two-phase-commit

两者有什么区别?表面上的协议看起来不同,但我想了解两者之间真正的不同之处以及为什么它们不等效。

Sha*_*k V 5

2 Phase locking在单个数据库实例中实现的一种机制,用于实现可序列化的隔离级别。可串行化事务级别是最强的隔离,即使并行执行事务,最终结果也与串行执行事务相同。其工作原理如下:

每当事务想要更新对象/行时,它必须获取写/排他锁。当事务想要读取对象/行时,它必须获取读/共享锁。锁必须保持到事务结束(提交或中止),而不是在每次查询后立即释放锁。因此,在执行事务时,事务持有的锁数量会扩展/增长。(读/写锁定行为与任何其他读/写锁定机制类似,因此这里不讨论)

事务结束时,锁被释放,并且事务持有的锁数量减少。

由于锁在一个阶段获取并在另一阶段释放,即获取阶段没有锁释放,释放阶段没有新的锁获取,这称为两阶段锁定。


2 phase commit是一种跨多个数据库实例实现分布式事务的算法,以确保所有节点提交或中止事务。

它的工作原理是让协调器(可以是启动事务的应用程序中的单独服务或库)发出两个请求 - PREPARE 到阶段 1 中的所有节点和 COMMIT(如果所有节点在 PREPARE 阶段返回 OK)或 ABORT(如果有任何节点返回) NOT OK in PREPARE PHASE) 到第 2 阶段的所有节点。

总而言之:

2 phase locking- 用于单个数据库实例内的可序列化隔离

2 phase commit- 跨分布式数据库/数据存储的多个节点的原子提交