65.9K
CodeProject 正在变化。 阅读更多。
Home

数据库死锁入门

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.76/5 (16投票s)

2008年10月2日

CPOL

4分钟阅读

viewsIcon

78680

向非技术人员解释数据库死锁。

引言

尝试向非技术人员解释数据库/事务死锁可能是一个挑战。

然而,这个概念是我们从学前班就开始接触的。

想象一下一个简单的地球涂色练习。除非你很有艺术天赋,否则只需要蓝色和绿色就可以完成。由于是国家资助的学校,只有一支绿色和一支蓝色蜡笔。

b0g0.png

 + 

crayons_32.png

 = 

b2g1.png

现在想象两个不同的、但基本相同的孩子,他们有一个细微的差别。

乔治喜欢绿色,所以他总是先用绿色涂色,然后使用剩余的任何颜色。

GFirst.gif

=

b0g0.png b0g1.png b1g1.png b2g1.png

鲍比喜欢蓝色,所以他总是先用蓝色涂色,然后使用剩余的任何颜色。

GFirst.gif

=

b0g0.png b1g0.png b2g0.png b2g1.png

比较

这两种方法都是有效的。它们都能在相同的时间内,用相同量的蜡笔,得到相同的结果。

然而,他们都非常专注于自己的工作,不会好好分享。一旦他们拿到一支蜡笔,就会一直拿着,直到整个画面完成。

在数据库术语中,这就像两个不同的例程,可能由两个供应商编写,在同一个数据库上工作。两者都可以写得很好,并且各自都能完美运行。当它们被迫一起工作时,乐趣就开始了。

当这两个例程尝试同时工作时会发生什么?

死锁

乔治和鲍比

  • 按自己的顺序工作
  • 两人都坚持在拿到蜡笔后不放,直到用完。
George 鲍比 结果

b0g0.png

b0g0.png

他们都开始。
乔治拿起绿色蜡笔开始涂绿色。
鲍比拿起蓝色蜡笔开始涂蓝色。

b0g1.png

b1g0.png

乔治画完绿色部分,然后要蓝色蜡笔。
鲍比说:“没门,我还没画完!”
乔治等待。
鲍比继续画蓝色。

b0g1.png

b2g0.png

乔治再次要蓝色蜡笔。
鲍比说:“没门,我还没画完!”
乔治等待鲍比。.
鲍比画完蓝色部分,然后要绿色蜡笔。
乔治说:“没门,我还没画完!”
鲍比等待乔治。

这就是死锁!

此时,所有人都在等待……永远……除非老师打破僵局,强迫其中一个重新开始(并希望他们能学会更好地分享)。虽然这似乎对受害者不公平,但现实是,如果没有外部干预,他们谁也无法完成。

现代数据库(和聪明的老师)能够识别这种情况的发生,并选择其中一个作为死锁的受害者。这个受害者必须重新开始,以便另一个能够继续。至少这样一来,他们最终都能完成。

一致的执行方式 

乔治和鲍比

  • 同意按相同的顺序工作
  • 两人都坚持在拿到蜡笔后不放,直到用完。

在数据库术语中,这就像将整个例程放入一个事务中。

George 鲍比 结果

b0g1.png

b0g0.png

在争夺第一支蜡笔的比赛中,总有人要赢!

b1g1.png

b0g0.png

鲍比还在等待绿色蜡笔被释放。

b2g1.png

b0g0.png

鲍比还在等待绿色蜡笔被释放。
乔治完成了,并归还了所有蜡笔。

b0g1.png

鲍比开始。

b1g1.png

b2g1.png

鲍比完成了。

他们最终都完成了,没有人被迫重新开始,但你可能会同意,这并不是真正的多任务处理。

一致的执行方式 + 资源释放 

乔治和鲍比

  • 同意按相同的顺序工作
  • 同意在用完蜡笔后立即归还

这相当于在数据库中将事务围绕离散的操作进行——尽可能小,同时保持完整性。

George 鲍比 结果

b0g1.png

b0g0.png

在争夺第一支蜡笔的比赛中,总有人要赢!

b1g1.png

b0g1.png

乔治用完绿色蜡笔并将其放回。然后他拿起蓝色蜡笔。
鲍比现在可以开始使用绿色蜡笔了。

b2g1.png

b0g1.png

鲍比用完绿色蜡笔并将其归还,他无法开始使用蓝色蜡笔,因为鲍比仍在用它。
稍后,乔治完成了并归还了所有蜡笔。

b1g1.png

鲍比现在可以开始使用蓝色蜡笔了。

b2g1.png

鲍比完成了。

他们最终都完成了,没有人被迫重新开始,并且一些任务可以在不长时间等待的情况下同时进行。

你看,蒂米!

据说过去有一部很俗气的节目,里面有一只名叫拉西的狗。这些节目总是以一个“你看,蒂米”的糖衣时刻结束,解释其中的道理。由于这个故事是关于分享的,我觉得我们有一些蒂米会引以为豪的教训。

  • 和朋友玩的时候,一定要遵守相同的游戏规则。
  • 除非你真的需要,否则不要索取某物。
  • 用完某样东西后,立即将其放回。
  • 分享很重要。 

这可以转化为以下数据库访问指南

  • 按相同顺序访问锁定的资源。
  • 如果查询是只读的,请使用 WITH (NOLOCK) 提示。
  • 如果你有一个事务,只持有它在你需要的时间内。
  • 分享很重要。 

愿你所有的蜡笔永远不折断!

历史

  • 2008年10月2日:首次发布
© . All rights reserved.