oracle锁与死锁概念,阻塞产生的缘由以及解决方案

锁是一种机制,一直存在;死锁是一种错误,尽可能避免。​html

首先,要理解锁和死锁的概念:​算法

一、锁:数据库

定义:简单的说,锁是数据库为了保证数据的一致性而存在的一种机制,其余数据库同样有,只不过实现机制上可能截然不同。​并发

那么,锁的种类有哪些?锁的种类有不少,根据保护的对象不一样,Oracle数据库锁能够分为如下几大类:DML锁(data locks,数据锁),用于保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护 数据库的内部结构。​oracle

在实际项目中遇到的最多的是DML锁,也可进一步说是行级锁。这些行级锁在程序并发访问的时候会形成程序很慢,或者直接访问不了的状况—这种现象称为阻塞。那么,产生阻塞的缘由是什么呢?定义:当一个会话保持另外一个会话正在请求的资源锁定时,就会发生阻塞。被阻塞的会话将一直挂起,直到持有锁的会话放弃锁定的资源为止。四个常见的DML语句会产生阻塞:工具

1)INSERT 2)​UPDATE 3)DELETE ​4)SELECT…FOR UPDATE​设计

二、死锁:htm

定义:当两个用户同时但愿持有对方的资源时就会发生死锁。即当两个用户互相等待对方释放资源时,oracle认定产生了死锁,在这种状况下,将以牺牲一个用户为代价,另外一个用户继续执行,牺牲的事物将回滚。对象

例子: 1:用户1对A表进行Update,没有提交。 2:用户2对B表进行Update,没有提交。 此时双反不存在资源共享的问题。 3:若是用户2此时对A表做update,则会发生阻塞,须要等到用户一的事物结束。 4:若是此时用户1又对B表做update,则产生死锁。此时Oracle会选择其中一个用户进行会滚,使另外一个用户继续执行操做。​​​blog

原由: Oracle的死锁问题实际上不多见,若是发生,基本上都是不正确的程序设计形成的,通过调整后,基本上都会避免死锁的发生。​​

死锁产生的缘由及四个必要条件:

产生死锁的缘由主要是:(1) 由于系统资源不足。(2) 进程运行推动的顺序不合适。(3) 资源分配不当等。若是系统资源充足,进程的资源请求都可以获得知足,死锁出现的可能性就很低,不然就会因争夺有限的资源而陷入死锁。其次,进程运行推动顺序与速度不一样,也可能产生死锁。

产生死锁的四个必要条件:(1) 互斥条件:一个资源每次只能被一个进程使用。(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已得到的资源保持不放。(3) 不剥夺条件:进程已得到的资源,在末使用完以前,不能强行剥夺。(4) 循环等待条件:若干进程之间造成一种头尾相接的循环等待资源关系。这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不知足,就不会发生死锁。

死锁的解除与预防:理解了死锁的缘由,尤为是产生死锁的四个必要条件,就能够最大可能地避免、预防和解除死锁。因此,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何肯定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态的状况下占用资源。所以,对资源的分配要给予合理的规划。

 

三、锁问题的解决:​​

产生缘由:

死锁问题,oracle默认会解决,这里的锁问题主要指的是因为数据库锁机制而致使的阻塞现象,或者是,在实际操做中,因为不正当操做或者程序中的bug,当程序卡在那里的时候形成的锁表现象,或者是,事物进行回滚或者提交时发生了异常,没有回滚成功或者提交成功,致使锁表(这是一种真正意义的死亡,虽然不是死锁,可是和死锁性质同样,甚至比死锁更可怕)。​​​​

处理方法:

1)使用工具:无论任何事情提早预防老是好的,能够用Spotlight软件对数据库的运行状态进行监控。(没用过)

2)​针对本系统此问题的解决方案(相似状况均可以套用哈)

 

原文:http://blog.sina.com.cn/s/blog_9d12d07f0102vu72.html

相关文章
相关标签/搜索