主要观点:
- 描述数据库管理系统中的并发控制方法及其差异,包括 CUBRID RDBMS 中的锁定技术、锁定模式及其兼容性、死锁及解决方案。
- 并发控制用于处理同时执行的多个事务对数据的更改,以满足数据库的 ACID 属性,有两阶段锁定(2PL)和多版本并发控制(MVCC)两种方法。
- CUBRID 实现了 2PL 方法,其关键是锁定需通过扩展阶段(获取)和收缩阶段(释放)两个阶段进行,通过锁管理器控制事务间对相同数据的访问。
- 介绍了多种锁模式,如共享锁(S 锁)、排他锁(X 锁)等,以及锁模式的兼容性表,用于最小化锁冲突。
- 死锁发生在多个事务相互等待对方持有的锁时,CUBRID 采用死锁检测方法,随机选择一个事务进行强制中止来解决死锁问题,同时还支持锁超时和查询取消来避免长时间等待。
关键信息:
- 2PL 中,事务在访问数据前获取锁,释放锁在事务结束时,不同事务的锁操作遵循锁兼容性规则以维护数据一致性。
- MVCC 允许每个事务有自己的更改版本,在事务回滚或提交时不影响其他事务,满足 ACID 属性。
- CUBRID 中锁模式的兼容性表显示了不同锁模式之间的兼容关系,如 X 锁与 IS 锁在表上不兼容等。
- 死锁检测通过绘制锁等待图来周期性检查,检测到死锁时随机选择一个事务中止,同时 CUBRID 支持锁超时和查询取消来避免长时间等待。
重要细节:
- CUBRID 中大多数与锁模式相关的代码在 lock_manager.c 文件中,设置锁使用 lock_object()函数,接收对象的 OID、所属类的 OID 和所需的锁模式等参数。
- 锁管理器的核心数据结构在 lock_manager.c 文件中定义,包括 LK_ENTRY 和 LK_RES 结构,用于表示锁和锁所属的资源,以及用于检测死锁的 Wait For Graph 相关结构。
- 死锁检测函数 lock_detect_local_deadlock()创建 Wait For Graph 并检测是否有循环,选择受害者事务时考虑多个因素,如是否为持有者、处于的阶段、锁超时设置等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。