数据库死锁的预防与解除

来源:互联网 发布:网络犯罪现场勘查 编辑:程序博客网 时间:2024/05/16 16:10

http://blog.csdn.net/imzoer/article/details/8062547

数据库死锁!!

今天面的工行,传说中的只问项目不问技术,但是被问了这么深入的问题。是RP不行啊。

死锁发生的条件:

1、资源不能共享,需要只能由一个进程或者线程使用

2、请求且保持,已经锁定的资源自给保持着不释放

3、不剥夺,自给申请到的资源不能被别人剥夺

4、循环等待

----------------------------------------------------------------------------

想预防死锁,把上面四个条件破坏一个就可以了。

防止死锁的途径就是避免满足死锁条件的情况发生,为此用户需要遵循以下原则。

(1)尽量避免并发地执行涉及到修改数据的语句。 【这个应该是能想到的,但是确实没想到】

(2)要求每个事务一次就将所有要使用的数据全部加锁,否则就不予执行。 【这个应该是能想到的,但是确实没想到】

(3)预先规定一个封锁顺序,所有的事务都必须按这个顺序对数据执行封锁。如不同的过程在事务内部对对象的更新执行顺序应尽量保持一致。

(4)每个事务的执行时间不可太长,在业务允许的情况下可以考虑将事务分割成为几个小事务来执行。【比如说把复杂的多表查询分散成多次单表查询】

(5)数据存储空间离散法。数据存储空间离散法是指采取各种手段,将逻辑上在一个表中的数据分散到若干离散的空间上去,以便改善对表的访问性能。主要通过将大表按行或列分解为若干小表,或者按不同的用户群分解两种方法实现。这种方法类似分散“数据热点”,但是确实,如果数据不是太经常被访问,那么死锁就不会太经常发生。

(6)还是类似(1)的,比如有一个修改上百条记录的update语句,我们可以修改成每10条一个update语句,或者干脆就每条记录一个update语句。

(7)将经常更新的数据库和查询数据库分开

----------------------------------------------------------------------------------------------

mysql的InnoDB中,锁是通过加在索引上实现的。

下面的例子讲述了一个mysql在innodb的索引上死锁的发生过程。

在图中,session1为了第一次更新,锁住了b=2 and c=3这个索引节点。

在session2中,为了更新,必须等待session1释放锁。

然后session1再请求一次更新,那么数据库就会检测到死锁的存在,不会等待timeout了,直接返回。

---------------------------------

如果数据库已经遇到了死锁,那么解决办法:

【待续】

0 0
原创粉丝点击