本文主要是介绍CMU15-445-并发控制,事务实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
LRU-K
LUR-K如何实现和图片
链接里面有算法过程和实现过程
事务并发控制
CMU15-445概览
2PL代表两阶段锁协议(Two-phase locking)。这是一种并发控制机制,用于关系数据库系统中以保障数据完整性。在这种机制中,事务的执行被划分为两个阶段:加锁阶段和释放锁阶段。加锁阶段发生在事务开始时,而释放锁阶段发生在事务结束时。这种划分确保了事务的原子性和隔离性,避免了死锁和活锁的情况。
enum class TransactionState { GROWING, SHRINKING, COMMITTED, ABORTED };
事务的四种状态 // 事务状态 {增长中,收缩中,已提交,已中止}
enum class IsolationLevel { READ_UNCOMMITTED, REPEATABLE_READ, READ_COMMITTED };
三种隔离级别,读未提交,可重复读,读提交
enum class WType { INSERT = 0, DELETE, UPDATE };
三种写入类型,插入,删除和更新
简而言之五种锁:
X exclusive锁,排它锁
S shared锁,读共享锁
IX intension exclusive 行排它锁
IS intension shared 行共享锁
SIX 共享意向排它锁如果需要修改表中的某些行,但需要读取整个表,这时候就可以给整张表加上SIX锁。可以看到它与IX锁的区别:加入SIX锁后,不能修改表的其它行,因为需要读整张表。
五种锁,详细介绍
为什么要six锁,什么是共享意向排它锁
锁升级的触发条件
锁升级通常在以下情况下触发:
锁升级的优点和缺点
优点:
缺点:
实际应用中的锁升级
在实际应用中,锁升级策略需要仔细权衡性能和并发性。例如,在高并发环境中,频繁的锁升级可能会导致大量的锁冲突,反而降低了系统的性能。因此,数据库管理系统通常会提供配置选项,允许管理员调整锁升级的阈值和策略,以适应特定的工作负载。
- 在收缩阶段加锁。
- 在收缩阶段解锁时出错
- 更新锁冲突,(另一个事务已经在等待升级这个锁)
- 死锁
- 在读未提交上加共享锁
enum class AbortReason {LOCK_ON_SHRINKING,UNLOCK_ON_SHRINKING,UPGRADE_CONFLICT,DEADLOCK,LOCKSHARED_ON_READ_UNCOMMITTED };
锁升级(Lock Escalation)是数据库管理系统(DBMS)和多线程编程中的一种技术,用于减少锁的开销和提高系统的性能。锁升级的过程是将多个细粒度的锁(如行锁或页锁)升级为一个更粗粒度的锁(如表锁或区锁)。这种操作通常在系统检测到持有大量细粒度锁时触发,以避免管理大量锁带来的开销。
锁升级的概念
在数据库管理系统中,当事务需要访问许多行或页时,会导致系统持有大量的行锁或页锁。管理这些大量的锁需要更多的内存和处理时间,这可能会影响系统的性能。为了优化性能,数据库管理系统会尝试将这些大量的细粒度锁升级为一个粗粒度锁。
例子
- 行锁升级为页锁:如果一个事务持有同一页上的许多行锁,系统可能会将这些行锁升级为一个页锁。
- 页锁升级为表锁:如果一个事务持有同一个表上的许多页锁,系统可能会将这些页锁升级为一个表锁。
- 锁数量超过阈值:系统持有的细粒度锁数量超过预设的阈值时,会触发锁升级。
- 资源耗尽:系统检测到管理大量细粒度锁消耗了过多的资源(如内存或处理时间)时,会触发锁升级。
- 事务模式:某些事务模式(如批量更新或删除)会显式地触发锁升级。
- 降低开销:减少了系统管理大量锁的开销,提高了性能。
- 减少锁争用:通过持有较少的锁,减少了锁争用的可能性。
- 增加锁冲突:粗粒度锁覆盖范围较大,可能会导致更多的锁冲突,影响并发性。
- 降低并发性:持有一个粗粒度锁会阻止其他事务访问被锁定的资源范围,从而降低了系统的并发性。
这篇关于CMU15-445-并发控制,事务实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!