事务饿死…
有可能存在这样一个事务序列,其中每个事务申请对该数据项加共享锁,每个事务在授权加锁后一小段时间内释放锁,而有个事务X总是不能在该数据项上加排他锁。事务X可能永远不能取得进展,这称为饿死(starved)。 我们可以通过按如下方式授权加锁来避免事务饿死:当事务T,申请对数据项Q加M型锁时,并发控制管理器授权加锁的条件是: 1⃣️不存在在数据项Q上持有与M型锁冲突的锁的其他事务。 2⃣️不存在等待对数据项Q加锁且先于T,申请加锁的事务。 引自 15.1.1锁 如果系统没有采用能保证不产生死锁的协议,那么系统必须采用检测与恢复机制。检查系统状的算法周期性地激活,判断有无死锁发生。如果发生死锁,解除死锁最通常的做法是回滚一个或多个事。 在选择哪个事务回滚时,有可能同一事务总是被选为牺牲者。这样一来,该事务总是不能完成其指定任务,这样就发生饿死(starvation)。我们必须保证一个事务被选为牺牲者的次数有限(且较少)。最常用的方案是在代价因素中包含回滚次数。 引自 15.2.2死锁检测与恢复
50人阅读
眯眼西索对本书的所有笔记 · · · · · ·
-
共享锁和排他锁
一个事务通过执行lock-S(Q)指令来申请数据项Q上的共享锁。类似地,一个事务通过执行lock-X...
-
死锁
两个事务两个数据项,每个事务各持有一个排他锁,在申请的共享锁刚好是对方事务的排他锁。 于...
-
事务饿死…
-
两阶段封锁协议
两阶段封锁协议(two-phase locking protocol)。该协议要求每个事务分两个阶段提出加锁和解...
-
select ** for update
在查询语句后添加for update子句会使系统出于并发控制的目的将读取的数据作为update 来对待。...
> 查看全部28篇
说明 · · · · · ·
表示其中内容是对原文的摘抄