您现在的位置是:群英 > 数据库 > 关系型数据库
Oracle死锁产生原因是什么,如何解决
Admin发表于 2022-05-11 14:26:532372 次浏览
关于“Oracle死锁产生原因是什么,如何解决”的知识点有一些人不是很理解,对此小编给大家总结了相关内容,文中的内容简单清晰,易于学习与理解,具有一定的参考学习价值,希望能对大家有所帮助,接下来就跟随小编一起学习一下“Oracle死锁产生原因是什么,如何解决”吧。

原因:1、事务之间对资源访问顺序的交替,两个用户相互访问了被对方锁住的表产生死锁;2、两个用户并发修改同一记录产生死锁;3、执行了一条不满足条件的语句,索引不当导致全局扫描产生死锁。

本教程操作环境:Windows10系统、Oracle 11g版、Dell G3电脑。

oracle死锁的原因是什么

数据库是一个多用户使用的共享资源,当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。加锁是实现数据库并发控制的一个非常重要的技术。在实际应用中经常会遇到的与锁相关的异常情况,当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就会出现死锁,严重影响应用的正常执行。

锁类型:

1、共享锁(Share Locks,即S锁):加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。

2、排它锁(Exclusive Locks,即X锁):当数据对象被加上排它锁时,其他的事务不能对它读取和修改。

3、独占锁:在共享锁的基础上,升级为独占锁。

4、更新锁:所有用户都可以读,但我将来可能会做更新操作,我已经获取了从共享锁(用来读)到排他锁(用来更新)的资格。一个事物只能有一个更新锁获此资格。

出现原因:

1、事务之间对资源访问顺序的交替:一个用户1 访问表A(锁住了表A),然后又访问表B;另一个用户2 访问表B(锁住了表B),然后企图访问表A;这时用户1由于用户2已经锁住表B,它必须等待用户2释放表B才能继续,同样用户2要等用户1释放表A才能继续,这就死锁就产生了。 解决方案:程序逻辑问题、注意表的调用顺序

2、并发修改同一记录:用户1查询一条纪录,然后修改该条纪录;这时用户2修改该条纪录,这时用户1的事务里锁的性质由查询的共享锁企图上升到独占锁,而用户2里的独占锁由于1有共享锁存在所以必须等1释放掉共享锁,而1由于2的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁 :

3、索引不当导致全表扫描:事务执行了一条不满足条件的语句执行了全表扫描或表数据量非常大索引建的过少或不合适的时候

解决方案:SQL语句中不要使用太复杂的关联多表的查询并建索引进行优化

注:

1、oracle 查看死锁并释放死锁

select sess.sid,     sess.serial#,     lo.oracle_username,     lo.os_user_name,     ao.object_name,     lo.locked_mode     from v$locked_object lo,     dba_objects ao,     v$session sess where ao.object_id = lo.object_id and lo.session_id = sess.sid; 
alter system kill session '738,1429';  --释放资源

2、mysql 查看死锁并释放死锁

show processlist         --查看数据库中各个进程的运行状态
select * from information_schema.innodb_trx        ---查询正在运行的事务
kill id

关于“Oracle死锁产生原因是什么,如何解决”的内容就介绍到这,感谢各位的阅读,相信大家对Oracle死锁产生原因是什么,如何解决已经有了进一步的了解。大家如果还想学习更多知识,欢迎关注群英网络,小编将为大家输出更多高质量的实用文章!

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

标签: oracle死锁原因
相关信息推荐
2021-11-08 15:44:04 
摘要:这篇文章在给大家分享一些oracle数据库基本语句,对大家学习Oracle数据库操作、Oracle表操作、数据操作等这些有一定的帮助,文中示例代码介绍的非常详细,感兴趣的朋友接下来一起跟随小编看看吧。
2022-10-19 17:30:17 
摘要:本篇文章带大家聊聊Mysql锁的内部实现机制,希望对大家有所帮助。
2022-09-14 17:54:55 
摘要:在mysql中,是否需要commit取决于存储引擎:1、若是不支持事务的存储引擎,如myisam,则不需要使用commit;2、若是支持事务的存储引擎,如innodb,则需要知道事务是否自动提交,因此需要使用commit。
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部