oracle 死锁问题

youjianbo_han_87 2010-03-17 11:29:28
最近在往oracle中插入测试数据时发现死锁问题,只要有删除该表的操作,就会发生死锁,使用解锁命令时,报 ora-000027 无法杀死当前Session 错误。查找了下相关资料,itpub上高手说 为从表的外键建立索引,这样就能避免上面出现的问题了。这也是在使用外键的推荐方式。但是设定后,还是没有作用.

另:发现,只要表之间有多表关联,那做完插入或者删除操作后,使用
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;
会发现,主表和外键表都被锁住了,是什么问题,请高手帮忙。
...全文
801 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
officecn 2010-03-31
  • 打赏
  • 举报
回复
查询一下你的v$transaction表,如果有记录,证明有未提交事务,当然会堵塞
etsilence 2010-03-21
  • 打赏
  • 举报
回复
LZ语气这么嚣张干嘛,管你什么工具做的,插入删除都commit成功的话,肯定不会发生死锁,你在PL/SQL

里试试insert但不提交,在同一会话中能查到这条记录,但是其他会话就无法查询,你怎么知道不是你没有提

交事务的后果。
friendjin 2010-03-21
  • 打赏
  • 举报
回复
请使用sqlplus 执行,目前很多DB工具在打开表数据时候,使用select ... for update打开,从而导致死锁。
youjianbo_han_87 2010-03-18
  • 打赏
  • 举报
回复
目前没有用程序跑,纯粹在 oracle工具里面跑,插入一条测试数据,没有问题,但是 再用 上面命令查看,主表和外键表已经被锁住了。这也和业务有关系???我找了下死锁发生原因相关的资料,也没有我这种情况就发生死锁的啊。
youjianbo_han_87 2010-03-18
  • 打赏
  • 举报
回复
程序本身执行是没有问题的。也不是连接堵塞问题。目前问题定位在 Db工具里面执行时,才会发生。

所以,请高手过来回答。新手旁观即可。
tzc 2010-03-18
  • 打赏
  • 举报
回复
插入删除之后没有提交才有发生死锁的可能
youjianbo_han_87 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tianzhichengzhr 的回复:]

插入删除之后没有提交才有发生死锁的可能
[/Quote]

DB工具里面做的,不是程序做的。而且也验证过了,没有提交问题。
youjianbo_han_87 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ojuju10 的回复:]

你的不是死锁,而是堵塞

死锁是数据库会自动解除的,自动牺牲一个连接,保证另外一个连接执行

堵塞只能一直等待,一直到对方提交或者回滚为止
[/Quote]

实践发现,在DB工具里面,只执行插入操作,然后查询,可以查询到这条记录,证明事物提交了。

但是,执行锁定查询语句,已经有表被锁了,根本没有进行过其他操作。所以,这好像也不是堵塞。
ojuju10 2010-03-18
  • 打赏
  • 举报
回复
http://blog.csdn.net/ojuju10/archive/2009/09/27/4601150.aspx
ojuju10 2010-03-18
  • 打赏
  • 举报
回复
你的不是死锁,而是堵塞

死锁是数据库会自动解除的,自动牺牲一个连接,保证另外一个连接执行

堵塞只能一直等待,一直到对方提交或者回滚为止

傻儿哥 2010-03-18
  • 打赏
  • 举报
回复
什么是数据库死锁
每个使用关系型数据库的程序都可能遇到数据死锁的情况。理解什么是死锁之前先要了解锁定的概念:如果需要“修改”一条数据,首先数据库管理系统会在上面加锁,以保证在同一时间只有一个事务能进行修改操作。锁定(Locking)发生在当一个事务获得对某一资源的“锁”时,这时,其他的事务就不能更改这个资源了,这种机制的存在是为了保证数据一致性。

多数情况下,可以认为如果一个资源被锁定,它总会在以后某个时间被释放。而死锁发生在当多个进程访问同一数据库时,其中每个进程拥有的锁都是其他进程所需的,由此造成每个进程都无法继续下去。简单的说,进程A等待进程B释放他的资源,B又等待A释放他的资源,这样就互相等待就形成死锁。

导致数据库死锁的原因
一般情况只发生锁超时,就是一个进程需要访问数据库表或者字段的时候,另外一个程序正在执行带锁的访问(比如修改数据),那么这个进程就会等待,当等了很久锁还没有解除的话就会锁超时,报告一个系统错误,拒绝执行相应的SQL操作。

发生死锁的情况比较少,比如一个进程需要访问两个资源(数据库表或者字段),当获取一个资源的时候进程就对它执行锁定,然后等待下一个资源空闲,这时候如果另外一个进程也需要两个资源,而已经获得并锁定了第二个资源,那么就会死锁,因为当前进程锁定第一个资源等待第二个资源,而另外一个进程锁定了第二个资源等待第一个资源,两个进程都永远得不到满足。
|||||||||||
两个会话之间有可能会发生死锁,这个时候Oracle、 数据库会在警告日志中出现600号错误。
但是死锁是不需要用户手工解锁的。因为Oracle、
数据库会自动把死锁进程中的一个结束。
suiziguo 2010-03-17
  • 打赏
  • 举报
回复
这个要从业务角度来检查。

看看跟踪文件信息,引起死锁的语句到底是什么。然后调整业务逻辑,更改事务结构。

3,492

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧