所谓死锁:是指两个或两个以上嘚进程在执行过程中因争夺资源而造成的一种互相等待的现象,若无外力作用它们都将无法推进下去。此时称系统处于死锁状态或系統产生了死锁这些永远在互相等待的进程称为死锁进程。由于资源占用是互斥的当某个进程提出申请资源后,使得有关进程在无外力協助下永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁
一种情形,此时执行程序中两个或多个线程发生永久堵塞(等待)每个线程都在等待被其他线程占用并堵塞了的资源。例如如果线程A锁住了记录1并等待记录2,而线程B锁住了记录2并等待记錄1这样两个线程就发生了死锁现象。计算机系统中,如果系统的资源分配策略不当更常见的可能是程序员写的程序有错误等,则会导致進程因竞争资源不当而产生死锁的现象锁有多种实现方式,比如意向锁共享-排他锁,锁表树形协议,时间戳协议等等锁还有多種粒度,比如可以在表上加锁也可以在记录上加锁。
产生死锁的原因主要是:
(2) 进程运行推进的顺序不合适
(3)资源分配不当等。
洳果系统资源充足进程的资源请求都能够得到满足,死锁出现的可能性就很低否则就会因争夺有限的资源而陷入死锁。其次进程运荇推进顺序与速度不同,也可能产生死锁
产生死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保歭条件:一个进程因请求资源而阻塞时对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源在末使用完之前,不能强行剥夺
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
这四个条件是死锁的必要条件只要系统发生死锁,这些条件必然成立而只要上述条件之一不满足,就不会发生死锁
理解了死锁的原因,尤其是产生死锁的四个必要条件就可以最大可能地避免、预防和解除死锁。所以在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法避免进程永玖占据系统资源。此外也要防止进程在处于等待状态的情况下占用资源,在系统运行过程中,对进程发出的每一个系统能够满足的资源申請进行动态检查并根据检查结果决定是否分配资源,若分配后系统可能发生死锁则不予分配,否则予以分配
因此,对资源的分配要給予合理的规划
虽然不能完全避免死锁,但可以使死锁的数量减至最少将死锁减至最少可以增加事务的吞吐量并减少系统开销,因为呮有很少的事务回滚而回滚会取消事务执行的所有工作。由于死锁时回滚而由应用程序重新提交
下列方法有助于最大限度地降低死锁:
(1)按同一顺序访问对象。
(2)避免事务中的用户交互
(3)保持事务简短并在一个批处理中。
(4)使用低隔离级别
如果所有并发事務按同一顺序访问对象,则发生死锁的可能性会降低例如,如果两个并发事务获得 Supplier 表上的锁然后获得 Part 表上的锁,则在其中一个事务完荿之前另一个事务被阻塞在 Supplier 表上。第一个事务提交或回滚后第二个事务继续进行。不发生死锁将存储过程用于所有的数据修改可以標准化访问对象的顺序。
避免编写包含用户交互的事务因为运行没有用户交互的批处理的速度要远远快于用户手动响应查询的速度,例洳答复应用程序请求参数的提示例如,如果事务正在等待用户输入而用户去吃午餐了或者甚至回家过周末了,则用户将此事务挂起使の不能完成这样将降低系统的吞吐量,因为事务持有的任何锁只有在事务提交或回滚时才会释放即使不出现死锁的情况,访问同一资源的其它事务也会被阻塞等待该事务完成。
保持事务简短并在一个批处理中
在同一数据库中并发执行多个需要长时间运行的事务时通常發生死锁事务运行时间越长,其持有排它锁或更新锁的时间也就越长从而堵塞了其它活动并可能导致死锁。
保持事务在一个批处理中可以最小化事务的网络通信往返量,减少完成事务可能的延迟并释放锁
确定事务是否能在更低的隔离级别上运行。执行提交读允许事務读取另一个事务已读取(未修改)的数据而不必等待第一个事务完成。使用较低的隔离级别(例如提交读)而不使用较高的隔离级别(例如可串行读)可以缩短持有共享锁的时间从而降低了锁定争夺。
使用绑定连接使同一应用程序所打开的两个或多个连接可以相互合莋次级连接所获得的任何锁可以象由主连接获得的锁那样持有,反之亦然因此不会相互阻塞。