对多个资源、数据库表、对象同时加锁时,需要保持一致的加锁顺序,否则可能会造 成死锁。

发布时间:2023年12月20日

死锁起因:

死锁是指两个或多个进程在执行过程中,由于竞争资源而造成的一种互相等待的现象,若无外力干涉,它们将一直等下去,不会再有任何进展,系统处于一种僵局状态。

死锁的四个必要条件:

  1. 互斥:一个资源只能被一个进程使用。
  2. 占有且等待:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
  3. 不可抢占:进程已获得的资源在未使用完之前,不能被其他进程强行夺走。
  4. 循环等待:若干进程之间形成一种头尾相接的循环等待关系。

解决方法:

  1. 预防死锁:通过避免死锁的四个必要条件,来防止死锁的发生。
  2. 避免死锁:当系统发现可能发生死锁时,采取措施阻止死锁的发生。
  3. 检测死锁:当系统发现已经发生死锁时,采取措施恢复系统。

在对多个资源、数据库表、对象同时加锁时,需要保持一致的加锁顺序,否则可能会造成死锁。例如,进程 A 先锁表 A,再锁表 B,进程 B 先锁表 B,再锁表 A,则会发生死锁。

避免死锁:

  1. 使用乐观锁:乐观锁假设不会发生冲突,在更新数据时,不加锁,而是在提交更新时,检查是否有其他进程修改了数据,如果有,则回滚更新。
  2. 使用悲观锁:悲观锁假设会发生冲突,在更新数据时,先加锁,然后再更新数据。
  3. 使用两阶段锁协议:两阶段锁协议是一种避免死锁的算法,它将锁的申请分为两阶段:获取阶段和释放阶段。在获取阶段,进程可以申请多个锁,但不能释放任何锁;在释放阶段,进程必须释放它已获得的所有锁。
文章来源:https://blog.csdn.net/zhoqua697/article/details/135080967
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。