精华内容
下载资源
问答
  • 死锁的解决方法

    2019-08-17 14:05:39
    死锁的解决方法锁的概念什么是数据库锁数据库锁的分类共享锁排他锁死锁死锁产生的必要条件死锁产生的原因如何避免死锁加锁顺序加锁时限死锁检测 锁的概念 什么是数据库锁 锁是事务对某个数据库中的资源存取前,先向...

    锁的概念

    什么是数据库锁

    锁是事务对某个数据库中的资源存取前,先向系统提出请求,封锁该资源,事务获得锁后,即取得对数据的控制权,在事务释放它的锁之前,其他事务不能更新此数据。当事务撤销后,释放被锁定的资源。

    数据库锁的分类

    共享锁

    共享锁又叫S锁或者读锁,加了共享锁的数据对象可以被其他事务读取,但不能修改,通常是该数据对象被读取完毕,锁立即被释放。

    排他锁

    排他锁又叫X锁或者写锁,当数据对象被加上排他锁时,一个事务必须得到锁才能对该数据对象进行访问,一直到事务结束锁才能被释放,在此之间其他的事务不能对它读取和修改。

    死锁

    死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,他们都将无法推进下去。这些永远在互相等待的进程成为死锁进程。

    死锁产生的必要条件

    1.互斥使用,即当资源被一个线程使用时,别的线程不能使用
    2.不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。
    3.请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。
    4.循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源,这样就形成了一个等待环路。

    死锁产生的原因

    1.系统资源的竞争

    通常系统中拥有的不可剥夺资源,其数量不足以满足多个进程运行的需要,使得进程在运行过程中,会因争夺资源而陷入僵局。

    2.进程推进顺序排法

    进程在运行过程中,请求和释放资源的顺序不当,也同样会导致死锁,例如,并发进程P1、P2分别保持了资源R1、R2,而进程P1申请资源R2,进程P2申请资源R1时,两者都会因为所需资源被占用而阻塞。

    3.信号量使用不当也会造成死锁

    进程间批次相互等待对方发来的消息,结果也会使得这些进程间无法继续向前推进。

    如何避免死锁

    加锁顺序

    一个线程需要一些锁,那么它必须安按照确定的顺序获取锁。它 只有获得了从顺序上排在前面的锁之后,才能获取后面的锁。

    加锁时限

    另外一个可以避免死锁的方法是在尝试获取锁的时候加一个超时时间,这也意味着在尝试获取锁的过程中若超过了这个时限该线程则放弃对该锁请求。并会进行回退并释放所有已经获得的锁,然后等待一段随机的时间再重试。这段随机的等待时间让其它线程有机会尝试获取相同的这些锁,并且让该用在没有获取的锁的时候可以继续运行(加锁超时后可以先继续运行干点其它事情,再回头来重复之前加锁的逻辑)。

    死锁检测

    每当一个线程获得了锁,会在线程和锁相关的数据结构中(map、graph等等)将其记下。除此之外,每当有线程请求锁,也需要记录在这个数据结构中。

    当一个线程请求锁失败时,这个线程可以遍历锁的关系图看看是否有死锁发生。如果检测到死锁,就释放所有锁,回退,并且等待一段随机的时间后再重试

    遇到死锁怎么办

    我们先了解下死锁定理:
    ①如果资源分配图中没有环路,则系统没有死锁;
    ②如果资源分配图中出现了环路,则系统可能有死锁。

    从上面的死锁定理中我们可以知道只要打破死锁的环路就可以解开死锁,以下是处理死锁的两种名方法:

    1)抢占资源:挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但应防止被挂起的进程长时间得不到资源,而处于资源匮乏的状态。

    2)终止(或撤销)进程:终止或撤销系统中的一个或多个死锁进程,直至打破死锁状态

    展开全文
  • oracle死锁的解决方法

    2021-01-09 15:01:49
    oracle死锁的解决方法 1.查找,SID和Serial# 他俩共同确定一唯一的session。 select object_name,machine,s.sid,s.serial# from vlockedobjectl,dbaobjectso,vlocked_object l,dba_objects o ,vlockedo​bjectl,dbao...

    oracle死锁的解决方法

    1.查找,SID和Serial#

    他俩共同确定一唯一的session。
    select object_name,machine,s.sid,s.serial#
    from vlockedobjectl,dbaobjectso,vlocked_object l,dba_objects o ,vsession s
    where l.object_id = o.object_id and l.session_id=s.sid;

    2.杀掉阻塞的session

    alter system kill session ‘975,62543’; (其中975,62543分别是上面查询出的sid,serial#.)

    展开全文
  • 实测有效的一个c++检测线程死锁的解决方法(实现和测试代码) 原创实测有效的一个c++检测线程死锁的解决方法,已应用于项目,实测有效 原创文章地址:https://blog.csdn.net/liaozhilong88/article/details/80354414...
  • SqlServer表死锁的解决方法

    千次阅读 2018-05-04 14:07:46
    SqlServer表死锁的解决方法 1 首先创建一个测试用的表:CREATE TABLE Test ( TID INT IDENTITY(1,1) )2 执行下面的SQL语句将此表锁住:SELECT * FROM Test WITH (TABLOCKX)3 通过下面的语句可以查看当前库中有哪些...

    SqlServer表死锁的解决方法

     1 首先创建一个测试用的表:

    CREATE TABLE Test
    (
        TID INT IDENTITY(1,1)
    )

    2 执行下面的SQL语句将此表锁住:

    SELECT * FROM Test WITH (TABLOCKX)

    3 通过下面的语句可以查看当前库中有哪些表是发生死锁的:

    SELECT request_session_id spid,OBJECT_NAME(resource_associated_entity_id)tableName
    FROM  sys.dm_tran_locks
    WHERE resource_type='OBJECT ' 

    4 上面语句执行结果如下:

    • spid :被锁进程ID。
    • tableName:发生死锁的表名。

    5 只需要使用kill关键字来杀掉被锁的进程ID就可以对表进行解锁:

    KILL 52
    

    展开全文
  • ORACLE表死锁的解决方法亲测有效!
  • 什么是死锁 我们先看看这样一个生活中例子:在一条河上有一座桥,桥面较窄,只能容纳一辆汽车通过,无法让两辆汽车并行。如果有两辆汽车A和B分别由桥两端驶上该桥,则对于A车来说,它走过桥面左面一段路(即...

    什么是死锁

      我们先看看这样一个生活中的例子:在一条河上有一座桥,桥面较窄,只能容纳一辆汽车通过,无法让两辆汽车并行。如果有两辆汽车A和B分别由桥的两端驶上该桥,则对于A车来说,它走过桥面左面的一段路(即占有了桥的一部分资源),要想过桥还须等待B车让出右边的桥面,此时A车不能前进;对于B车来说,它走过桥面右边的一段路(即占有了桥的一部分资源),要想过桥还须等待A车让出左边的桥面,此时B车也不能前进。两边的车都不倒车,结果造成互相等待对方让出桥面,但是谁也不让路,就会无休止地等下去。这种现象就是死锁。如果把汽车比做进程,桥面作为资源,那麽上述问题就描述为:进程A占有资源R1,等待进程B占有的资源Rr;进程B占有资源Rr,等待进程A占有的资源R1。而且资源R1和Rr只允许一个进程占用,即:不允许两个进程同时占用。结果,两个进程都不能继续执行,若不采取其它措施,这种循环等待状况会无限期持续下去,就发生了进程死锁。  

      在计算机系统中,涉及软件,硬件资源都可能发生死锁。例如:系统中只有一台CD-ROM驱动器和一台打印机,某一个进程占有了CD-ROM驱动器,又申请打印机;另一进程占有了打印机,还申请CD-ROM。结果,两个进程都被阻塞,永远也不能自行解除。

      所谓死锁,是指多个进程循环等待它方占有的资源而无限期地僵持下去的局面。很显然,如果没有外力的作用,那麽死锁涉及到的各个进程都将永远处于封锁状态。从上面的例子可以看出,计算机系统产生死锁的根本原因就是资源有限且操作不当。即:一种原因是系统提供的资源太少了,远不能满足并发进程对资源的需求。这种竞争资源引起的死锁是我们要讨论的核心。例如:消息是一种临时性资源。某一时刻,进程A等待进程B发来的消息,进程B等待进程C发来的消息,而进程C又等待进程A发来的消息。消息未到,A,B,C三个进程均无法向前推进,也会发生进程通信上的死锁。另一种原因是由于进程推进顺序不合适引发的死锁。资源少也未必一定产生死锁。就如同两个人过独木桥,如果两个人都要先过,在独木桥上僵持不肯后退,必然会应竞争资源产生死锁;但是,如果两个人上桥前先看一看有无对方的人在桥上,当无对方的人在桥上时自己才上桥,那麽问题就解决了。所以,如果程序设计得不合理,造成进程推进的顺序不当,也会出现死锁。

     

    避免死锁的几种方式:

    设置加锁顺序

     

    设置加锁时限

     

    死锁检测

     

    设置加锁顺序(线程按照一定的顺序加锁):

    死锁发生在多个线程需要相同的锁,但是获得不同的顺序。

     

    假如一个线程需要锁,那么他必须按照一定得顺序获得锁。 

    例如加锁顺序是A->B->C,现在想要线程C想要获取锁,那么他必须等到线程A和线程B获取锁之后才能轮到他获取。(排队执行,获取锁)

     

    缺点: 

    按照顺序加锁是一种有效的死锁预防机制。但是,这种方式需要你事先知道所有可能会用到的锁,并知道他们之间获取锁的顺序是什么样的。

     

    设置加锁时限:(超时重试)

    在获取锁的时候尝试加一个获取锁的时限,超过时限不需要再获取锁,放弃操作(对锁的请求。)。

     

    若一个线程在一定的时间里没有成功的获取到锁,则会进行回退并释放之前获取到的锁,然后等待一段时间后进行重试。在这段等待时间中其他线程有机会尝试获取相同的锁,这样就能保证在没有获取锁的时候继续执行比的事情。

     

    缺点: 

    但是由于存在锁的超时,通过设置时限并不能确定出现了死锁,每种方法总是有缺陷的。有时为了执行某个任务。某个线程花了很长的时间去执行任务,如果在其他线程看来,可能这个时间已经超过了等待的时限,可能出现了死锁。

     

    在大量线程去操作相同的资源的时候,这个情况又是一个不可避免的事情,比如说,现在只有两个线程,一个线程执行的时候,超过了等待的时间,下一个线程会尝试获取相同的锁,避免出现死锁。但是这时候不是两个线程了,可能是几百个线程同时去执行,大的基数让事件出现的概率变大,假如线程还是等待那么长时间,但是多个线程的等待时间就有可能重叠,因此又会出现竞争超时,由于他们的超时发生时间正好赶在了一起,而超时等待的时间又是一致的,那么他们下一次又会竞争,等待,这就又出现了死锁。

     

    死锁检测:

    当一个线程获取锁的时候,会在相应的数据结构中记录下来,相同下,如果有线程请求锁,也会在相应的结构中记录下来。当一个线程请求失败时,需要遍历一下这个数据结构检查是否有死锁产生。

     

    例如:线程A请求锁住一个方法1,但是现在这个方法是线程B所有的,这时候线程A可以检查一下线程B是否已经请求了线程A当前所持有的锁,像是一个环,线程A拥有锁1,请求锁2,线程B拥有锁2,请求锁1。 

    当遍历这个存储结构的时候,如果发现了死锁,一个可行的办法就是释放所有的锁,回退,并且等待一段时间后再次尝试。

     

    缺点: 

    这个这个方法和上面的超时重试的策略是一样的。但是在大量线程的时候问题还是会出现和设置加锁时限相同的问题。每次线程之间发生竞争。 

    还有一种解决方法是设置线程优先级,这样其中几个线程回退,其余的线程继续保持着他们获取的锁,也可以尝试随机设置优先级,这样保证线程的执行。

     

    喜欢本文的朋友们,欢迎关注微信公众号“Java面试达人”,收看更多精彩内容

    展开全文
  • 代码如下: SELECT * FROM Test WITH (TABLOCKX) 3 通过下面的语句可以查看当前库中有哪些表是发生死锁的: 代码如下: SELECT request_session_id spid,OBJECT_NAME(resource_associated_entity_id)tableName
  • SqlServer表死锁的解决方法(转)

    千次阅读 2016-04-05 11:39:39
    SqlServer表死锁的解决方法 前些天写一个存储过程,存储过程中使用了事务,后来我把一些代码注释掉来进行调试找错,突然发现一张表被锁住了,原来是创建事务的代码忘记注释掉。本文表锁住了的解决方法。 其实不光...
  • create proc p_lockinfo@kill_lock_spid bit=1, --是否杀掉死锁的进程,1 杀掉, 0 仅显示@show_spid_if_nolock bit=1 --如果没有死锁的进程,是否显示正常进程信息,1 显示,0 不显示asdeclare @count int,@s nvarchar...
  • 尽管死锁很少发生,但一旦发生就会造成应用停止响应 ''' #2.例子:有两个人分别做"西兰花"和"红烧肉",每个人都需要"锅"和"铲子" import threading,time class XiLanHua_Thread(threading.Thr...
  • 深入理解--死锁以及死锁的解决方法

    千次阅读 2018-05-29 20:02:43
    部分内容转载自https://blog.csdn.net/yanxiaolx/article/details/519440481.死锁:如果一组进程中的每一个进程都在等待仅由该组进程中的其它进程才能引发的事件,那么该组进程是死锁的,例如,如果线程A锁住了记录1...
  • 一个简单排查和解决方法 死锁时会报错:ORA-00060: deadlock detected while waiting for resource 对应中文报错是:ORA-00060: 等待资源时检测到死锁 执行下面SQL,查看被锁表: select object_name, ...
  • 线程 线程可以简单理解为同一进程中有多个计数器,每个线程的执行时间不确定,而每个进程的时间片相等,线程是操作系统调度执行...死锁的演示 死锁实例: import threading import time #创建互斥锁,默认是没有上...
  • db2 表暂挂和死锁的解决方法

    千次阅读 2019-03-09 11:35:58
    一,表暂挂解决 1.连接数据库 su - db2ydb db2 connect to tmisygdb user tmisusr using tmisusr 2.表空间挂起怎样解决? 查看表空间是否被挂起 list tablespaces show detail 而后查看信息,当表状态不为&...
  • db2 数据库死锁的解决方法

    千次阅读 2014-05-28 00:03:15
    目前应用系统最常使用的DB2数据库版本有多个,有8.1,8.2,9.1还有新推出的9.5,对于不同版本的DB2数据库提供的解决办法不尽相同,下面对于上述问题的解决作了一个简单说明,希望对大家有用。 首先在上线前...
  • 线程生命周期分为以下几种情况 1:当创建一个线程时候: New状态 2:执行start: 就绪状态,这个时候还没有运行,需要分配CPU资源才能运行 3: 运行状态: 该线程被调度了分配到了CPU资源 4:如果一切正常,线程里...
  • 调用SendMessage 产生死锁的解决方法

    千次阅读 2012-09-05 23:10:05
    今天折腾了半天的死锁, ThreadB里面SendMessage给ThreadA了: ThreadB::run()/ pWnd->SendMessage(...), 在退出程序之前,ThreadA等待ThreadB结束:threadB.wait(), 可是ThreadB结束不了,ThreadA就等死了,明天试试在...
  • 最近在项目上线使用过程中使用SqlServer时候发现在高并发情况下,频繁更新和频繁查询引发死锁。 通常我们知道如果两个事务同时对一个表进行插入或修改数据,会发生在请求对表X锁时,已经被对方持有了。 由于得不...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,485
精华内容 994
关键字:

死锁的解决方法