数据库死锁入门






4.76/5 (16投票s)
向非技术人员解释数据库死锁。
引言
尝试向非技术人员解释数据库/事务死锁可能是一个挑战。
然而,这个概念是我们从学前班就开始接触的。
想象一下一个简单的地球涂色练习。除非你很有艺术天赋,否则只需要蓝色和绿色就可以完成。由于是国家资助的学校,只有一支绿色和一支蓝色蜡笔。
|
+ |
|
= |
|
现在想象两个不同的、但基本相同的孩子,他们有一个细微的差别。
乔治喜欢绿色,所以他总是先用绿色涂色,然后使用剩余的任何颜色。
![]() |
= |
![]() |
![]() |
![]() |
![]() |
鲍比喜欢蓝色,所以他总是先用蓝色涂色,然后使用剩余的任何颜色。
![]() |
= |
![]() |
![]() |
![]() |
![]() |
比较
这两种方法都是有效的。它们都能在相同的时间内,用相同量的蜡笔,得到相同的结果。
然而,他们都非常专注于自己的工作,不会好好分享。一旦他们拿到一支蜡笔,就会一直拿着,直到整个画面完成。
在数据库术语中,这就像两个不同的例程,可能由两个供应商编写,在同一个数据库上工作。两者都可以写得很好,并且各自都能完美运行。当它们被迫一起工作时,乐趣就开始了。
当这两个例程尝试同时工作时会发生什么?
死锁
乔治和鲍比
- 按自己的顺序工作
- 两人都坚持在拿到蜡笔后不放,直到用完。
George | 鲍比 | 结果 |
|
|
他们都开始。 |
|
|
乔治画完绿色部分,然后要蓝色蜡笔。 |
|
|
乔治再次要蓝色蜡笔。 这就是死锁! |
此时,所有人都在等待……永远……除非老师打破僵局,强迫其中一个重新开始(并希望他们能学会更好地分享)。虽然这似乎对受害者不公平,但现实是,如果没有外部干预,他们谁也无法完成。
现代数据库(和聪明的老师)能够识别这种情况的发生,并选择其中一个作为死锁的受害者。这个受害者必须重新开始,以便另一个能够继续。至少这样一来,他们最终都能完成。
一致的执行方式
乔治和鲍比
- 同意按相同的顺序工作
- 两人都坚持在拿到蜡笔后不放,直到用完。
在数据库术语中,这就像将整个例程放入一个事务中。
George | 鲍比 | 结果 |
|
|
在争夺第一支蜡笔的比赛中,总有人要赢! |
|
|
鲍比还在等待绿色蜡笔被释放。 |
|
|
鲍比还在等待绿色蜡笔被释放。 |
|
鲍比开始。 |
|
|
||
|
鲍比完成了。 |
他们最终都完成了,没有人被迫重新开始,但你可能会同意,这并不是真正的多任务处理。
一致的执行方式 + 资源释放
乔治和鲍比
- 同意按相同的顺序工作
- 同意在用完蜡笔后立即归还
这相当于在数据库中将事务围绕离散的操作进行——尽可能小,同时保持完整性。
George | 鲍比 | 结果 |
|
|
在争夺第一支蜡笔的比赛中,总有人要赢! |
|
|
乔治用完绿色蜡笔并将其放回。然后他拿起蓝色蜡笔。 |
|
|
鲍比用完绿色蜡笔并将其归还,他无法开始使用蓝色蜡笔,因为鲍比仍在用它。 |
|
鲍比现在可以开始使用蓝色蜡笔了。 |
|
|
鲍比完成了。 |
他们最终都完成了,没有人被迫重新开始,并且一些任务可以在不长时间等待的情况下同时进行。
你看,蒂米!
据说过去有一部很俗气的节目,里面有一只名叫拉西的狗。这些节目总是以一个“你看,蒂米”的糖衣时刻结束,解释其中的道理。由于这个故事是关于分享的,我觉得我们有一些蒂米会引以为豪的教训。
- 和朋友玩的时候,一定要遵守相同的游戏规则。
- 除非你真的需要,否则不要索取某物。
- 用完某样东西后,立即将其放回。
- 分享很重要。
这可以转化为以下数据库访问指南
- 按相同顺序访问锁定的资源。
- 如果查询是只读的,请使用 WITH (NOLOCK) 提示。
- 如果你有一个事务,只持有它在你需要的时间内。
- 分享很重要。
愿你所有的蜡笔永远不折断!
历史
- 2008年10月2日:首次发布