什么情况下会发生死锁,如何解决死锁

2021.01.22 08:01 42
阅读约 3 分钟

🔒锁的概念

锁是事务对某个数据库中的资源的控制权,若一个事务获取得到锁,在该事务释放前,其它事务都不能更新此数据。

数据库锁的分类

共享锁:S锁或者读锁,共享锁数据对象仍然可以被其它事务读取,但不能修改。当该对象数据被读取完毕时,释放锁。

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

什么是死锁

死锁是指两个或两个以上的进程由于竞争资源或者彼此通信导致的一种阻塞现象,这些永远在等待的进程称为死锁进程。

什么情况下会产生死锁

互斥使用抢不走当一个资源被一个线程占有的时候,其它线程不能使用。

不可抢占想抢也不行资源只能由资源使用者释放。

请求和保持抢了还想抢资源请求者在请求其他的资源的同时保持对原有资源的占有。

循环等待(连环抢劫):存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。

如何解决死锁

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

加锁时限(限时抢夺):在尝试获取锁的时候加一个超时时间,这也就意味着在尝试获取锁的过程中若超过了这个时限该线程则放弃对该锁请求,并且释放所有得到的锁。

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

 

字数:656 发布于 1 个月前
Copyright 2018-2021 Siques