首先,我们要定义下什么是“锁的粒度”:所谓粒度就是作用范围,锁的粒度就是锁的作用范围。数据库中锁的粒度从高到低依次划分为:数据库、表、页、行。
什么是死锁,顺带说一下吧,当多个操作竞争资源,每个操作都无法获得全部所需资源时,系统进入死锁,如无外力作用,系统将无限等待下去,死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
打破任何一个条件就不会发生死锁。
我们先来看一个生活场景:
有两个文具盒,一个放的是笔(圆珠笔、铅笔等等),一个放的是修正工具(橡皮擦、改正带等等).
现在有两个人,他们要画图,可能需要的物品当然有笔和修正工具。
假设我们用全局的独享,就是两个文具盒都只能同时被一个人拥有,一个人来拿笔,连带修正工具一起归他,这样绝对不会发生图画不下去的问题,因为所要的工具都会一次性给同一个人。但是问题也很严重,资源严重浪费,因为笔和橡皮擦肯定不会同时使用,也不会同时用2支笔。
假设我们用的是文具盒的独享,就是同时一个文具盒只能被一个人拥有,一个人要笔,整个放笔的文具盒都给他,一个人要修正图画,则整个放修正工具的文具盒都给他。这可能出现的问题就是,一个人想,我要画图,橡皮擦肯定要,橡皮擦的文具盒正好在,就先把这个文具盒拿下,等笔盒回来了再继续画。另一个人拿了笔盒,画了一会要修正,一看,放橡皮擦的文具盒没了,就等文具盒放回来。这样两个人就无限等待了,只要其中一个人看到东西不全就不拿,就不会无限等。
假设我们用的是物品独享,就是一支笔、一个橡皮擦只能被一个人拥有,一个人要画图,就拿一支笔,要改就拿一个橡皮擦或者改正带。除非只有一支笔,否则不会出现无限等待。当然,只有一支笔跟独享一个文具盒没区别。
例子中的独享就是锁的概念。
再来看数据库中的实例:
假设有A,B两个数据库,A库有A1,A2两个表,B库也有B1和B2两个表,每个表都有都有N条记录(N>1).
现在有两个操作P1和P2并发,我们来看一个场景:
P1要操作A1表的一行和B2表的一行,P2要操作A2表的一行和B1表的一行。
现在假设我们用库锁,P1先行,A库被锁住,P2后行,先锁住了B库,P1再去锁B库,已经被P2锁住了,P2去锁A库,被P1锁住了,这样P1,P2就陷入死锁,都占用部分资源。
假设我们用的是表锁呢,P1先行,A1被锁住,P2后行,A2被锁住,P1再锁B1,P2再锁B2,怎么也不会发生死锁。
采用行锁的话就更不会死锁了,操作的表都不同。
看到这里,大家就说,锁的粒度越大,越容易死锁,真的吗?那我再来个最大的锁,实例锁,一次性锁住整个实例,P1先行,整个实例被锁住,P2被阻塞,等P1操作完P2再来,肯定不会死锁,为什么?因为这已经退化成串行操作了。
也就是说,虽然一般情况下锁的粒度越大,死锁概率越大,但是,当锁的粒度成为全局锁,把操作变成串行后,就不一样了,根本不会死锁。
我们把P1和P2操作改一下,P1操作A1表的i行和A2表的j行,P2操作A1表的j行和A2表的i行(i<>j),再来看:
假设我们使用库锁,P1先行,A库就锁住,P2阻塞,P1完成P2锁A库,不会死锁。
假设我们使用表锁,P1先行,A1表锁住,P2后行,A2表锁住,P1再去锁A2表,已经被P2锁了,死锁发生。
假设我们使用行锁,P1先行,锁住A1表第i行,P2后行,锁住A1表第j行,P1再锁A2表j行,P2再锁A1表j行,完成操作。
也就是说,不能就认为所有情况都是锁的粒度越大死锁概率越大,而是要看操作的粒度,如果锁的粒度比操作的粒度大或相同,操作就会变成串行,根本不可能发生死锁。
顺便说以下,数据库中并行操作的情况很多,为什么很少发生死锁呢,因为只要打破死锁四个条件任意一个,就可以避免死锁,只会发生阻塞,一个操作释放资源后就可以继续进行。
方法很多,例如把锁的粒度提高到跟操作的粒度大,并发一个表,我就一次锁一个表,并发一个库,我就一次锁一个库,这实际上是什么呢,就是把并行弄成串行了,一般没人这么做,并发只有1,效率太低。
一般是多管齐下避免死锁,一是使用不同等级的锁,例如意向锁,互斥锁等,其实就是打破死锁第一条件——互斥条件,资源某些时候可以共享,例如读锁可以共享读,不过因为还是存在互斥锁,依然可能死锁。
第二就是可以按顺序锁资源,例如锁表只能按A->B->C的顺序锁,如果我要A,B表,锁了A表后发现B表已经被锁了,就释放A表的锁(或者使用意向锁),延时再尝试,直到所有资源都可以锁住(互斥锁/共享锁),这就是打破了死锁第二条件——请求与保持条件,不能获得全部资源就先释放锁,等能获得了再说,这样操作可以完全避免死锁。
相关推荐
- 使用更细粒度的锁或者改变锁模式。 - 增加等待时间限制或超时设置。 #### 五、预防措施 为了避免Oracle数据库中出现解锁和死锁问题,可以采取以下预防措施: 1. **优化应用程序设计**:确保应用程序遵循最佳...
数据库实验-锁冲突与死锁
相反,粒度较细的锁(如实例级别锁)可以让更多线程并发执行,提高性能,但也可能增加锁竞争和死锁的风险。因此,在设计多线程程序时,我们需要根据实际情况权衡锁的粒度,以达到最佳的并发性能和安全性。 总结来说...
- 在编程时,对可能出现死锁的操作进行预测和处理,例如使用事务的乐观锁或悲观锁策略。 通过理解Oracle表死锁的原理、使用上述检测和解决方法,以及遵循最佳实践,可以有效地管理和防止数据库死锁,保证系统的稳定...
HIS系统SQL Server数据库死锁问题的分析与解决 SQL Server数据库是HIS系统...为了避免和解决死锁问题,我们需要了解SQL Server数据库的锁机制和锁模式,选择合适的锁粒度,并根据实际情况,选择合适的锁模式和锁粒度。
- 使用更细粒度的锁:行级锁相对于表级锁可以降低死锁概率,但可能增加锁定冲突。 - 避免长时间持有锁:尽快完成事务操作,减少其他事务等待时间。 4. **load file异常**: 此压缩包中提及的"load file异常"可能...
在电子政务领域,汽车电子锁及其防死锁装置是一个重要的技术议题。电子政务是指政府机构利用信息技术手段,提高公共服务效率,实现政务信息的数字化管理。在这个主题中,我们主要探讨的是汽车安全系统的智能化升级,...
1. **事务设计**:尽可能地减少事务的粒度,使其尽快完成,减少锁定资源的时间,降低死锁的可能性。 2. **资源获取顺序**:设定一定的资源获取顺序,避免不同事务间的循环等待。 3. **超时和重试**:为事务设置合理...
更新锁在预修改阶段可以与共享锁共享,也就是说允许一个用户更新数据同时允许其他用户读取数据页。当发生数据交换时,更新锁自动被修改成排它锁。 排它锁(Exclusive Locks)又称为“写锁”,对于任何可能引起数据...
3处理机调度与死锁3处理机调度与死锁3处理机调度与死锁3处理机调度与死锁
- **减少事务的粒度**:将大事务拆分为小事务,每个事务处理更少的数据,可以降低死锁的概率。 - **资源获取顺序一致**:确保所有事务按照相同的顺序获取资源,这样可以打破循环等待条件。 - **使用快照隔离**:...
处理机调度与死锁是计算机操作系统中的核心概念,涉及到进程管理的各个方面,包括进程的创建、执行以及终止等。在本总结中,我们将详细探讨处理机调度策略、死锁的概念、必要条件、预防和处理方法,并讨论它们在不同...
在IT领域,尤其是在数据库系统和多线程编程中,锁机制是确保数据一致性与安全性的关键工具。然而,不当的锁使用可能导致锁阻塞和死锁等问题,这正是"锁阻塞诊断和死锁模拟"这个主题的核心内容。本文将深入探讨这两个...
- 监控和调整锁粒度:根据应用需求调整锁的粒度,平衡并发与锁定冲突。 总之,"Oracle死锁查杀PB版"是DBA处理数据库死锁问题的得力助手。通过理解死锁的原理,结合此工具,可以有效地防止和解决死锁问题,确保...
在Java编程中,死锁是多线程环境下常见的问题,当两个或多个线程相互等待对方释放资源,...通过合理设计同步策略、限制锁的范围以及避免嵌套锁和循环等待,可以有效地降低死锁发生的概率,提高程序的并发性能和稳定性。
orcal解锁杀死死锁进程导出表中的数据到Excel,包含字段名,文件为真正的Excel文件 ,如果文件不存在,将自动创建文件 ,如果表不存在,将自动创建表 基于通用性考虑,仅支持导出标准数据类型
本文主要探讨了这两种数据库系统中的锁机制以及死锁的处理。 首先,锁的主要作用在于防止多个事务同时修改同一数据,确保数据的隔离性和一致性。在 Oracle 中,锁通过一种称为排队的队列结构实现,当对象被锁定时,...
操作系统 第三章处理机调度与死锁思维导图
informix锁查看和解锁,可以借鉴一下,有参考意义,还不错