database - 2PC(2阶段提交)和2 PL(2阶段锁定)之间的区别
问题描述
两者有什么区别?表面上的协议看起来不同,但我想了解两者之间真正的不同之处以及它们为什么不等价。
解决方案
2 Phase locking
是在单个数据库实例中实现的一种机制,以实现可序列化的隔离级别。可序列化事务级别是最强的隔离,即使并行执行事务,最终结果也与串行执行的事务相同。它的工作原理如下:
每当事务想要更新一个对象/行时,它必须获取一个写/独占锁。当事务想要读取一个对象/行时,它必须获取一个读/共享锁。不是在每次查询后立即释放锁,而是必须保持锁直到事务结束(提交或中止)。因此,在执行事务时,事务持有的锁数会扩大/增长。(读/写锁定行为类似于任何其他读/写锁定机制,因此这里不讨论)
在事务结束时,锁被释放,事务持有的锁数量减少。
由于锁是在一个阶段获得并在另一个阶段释放,即在获取阶段没有锁释放,在释放阶段没有新的锁获取,这称为2阶段锁定。
2 phase commit
是一种跨多个数据库实例实现分布式事务的算法,以确保所有节点都提交或中止事务。
它的工作原理是让协调器(可以是启动事务的应用程序中的单独服务或库)发出两个请求 - 准备阶段 1 中的所有节点和提交(如果所有节点在准备阶段返回 OK)或 ABORT(如果返回任何节点NOT OK in PREPARE PHASE) 到阶段 2 的所有节点。
TLDR:
2 phase locking
- 用于单个数据库实例中的可序列化隔离
2 phase commit
- 跨分布式数据库/数据存储的多个节点的原子提交
推荐阅读
- jquery - jquery 返回未定义的读取 json
- c# - 为 json 字符串创建 c# 类,其中有数字作为对象中的变量
- java - 什么是 MavenProject.managedVersionMap
- c++ - “无运算符”运算符,它是什么?
- javascript - 在返回未定义的二叉树函数中查找最近的节点
- spring - java.lang.IllegalStateException:Bean 名称“greeting”的 BindingResult 和普通目标对象都不能用作请求属性
- php - 如何手动(无形式)验证用户?Cakephp 4x
- excel - Excel Vlookup 或公式
- amazon-dynamodb - 如何在 DynamoDB 中实现按项目的任意属性排序
- python - 在使用 pymongo 的 update_many 时应用不区分大小写的过滤器