数据库死锁的预防与解除
来源:互联网 发布:网络犯罪现场勘查 编辑:程序博客网 时间: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了,直接返回。
---------------------------------
如果数据库已经遇到了死锁,那么解决办法:
【待续】
- 数据库死锁的预防与解除
- 数据库死锁的预防与解除
- 死锁的产生、解除与预防
- 死锁四个必要条件及死锁的预防、检测、避免、解除
- 死锁产生的原因和必要条件及预防死锁的方法及死锁的检测与解除
- 死锁产生的原因和必要条件及预防死锁的方法及死锁的检测与解除
- 死锁产生的原因和必要条件及预防死锁的方法及死锁的检测与解除
- 死锁的产生与预防
- 死锁的预防与避免
- 死锁的产生与解除
- 【Linux】死锁的预防、检测与修复
- 死锁预防与死锁避免
- 死锁条件与预防
- 程序死锁与预防
- 什么是死锁以及死锁的预防、检测与修复
- 预防死锁的方法
- 死锁的解除
- 什么是死锁,简述死锁发生的四个必要条件,如何避免与预防死锁
- Android上传图片之调用系统拍照和从相册选择图片
- 手把手教你使用Core animation 做动画(上)
- 从简单的左右列固定、中间列自适应的三列布局看布局设计技巧以及margin负值使用
- 我的技术地图
- Oracle 建立索引及SQL优化
- 数据库死锁的预防与解除
- select重复选择同一项,还可以触发onchange事件
- Java8 Stream经典示例
- 生活中八条硬道理
- GO int64转int32
- Qt产生随机数
- 在 Mac mini 上架设 Jenkins 服务器来运行 iOS 测试
- loadView、viewDidLoad及viewDidUnload的关系
- 不忘初心