通常,死锁意味着两个或更多实体阻塞某些源,并且没有一个实体能够完成,因为它们以循环的方式阻塞源.
举个例子:假设我有表A和表B,我需要在A中进行一些更新,然后B决定在使用时锁定这两个表(这是非常愚蠢的行为,但现在它起到了应有的作用).在同一时刻,另一个人以相反的顺序做同样的事情--先锁定B,然后锁定A.
按照时间顺序,这种情况会发生:
进程1:锁定A
进程2:锁定B
proc1:Lock B-开始等待,直到proc2释放B
proc2:Lock A-开始等待,直到proc1释放A
他们两个都不会完成的.这是一个僵局.在实践中,这通常会导致超时错误,因为不希望任何查询永远挂起,并且底层系统(例如数据库)将终止未及时完成的查询.
一个现实世界中的死锁例子是,当你把家里的 keys 锁在车里,而车 keys 锁在家里.