最近在往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;
会发现,主表和外键表都被锁住了,是什么问题,请高手帮忙。

解决方案 »

  1.   

    目前没有用程序跑,纯粹在 oracle工具里面跑,插入一条测试数据,没有问题,但是 再用 上面命令查看,主表和外键表已经被锁住了。这也和业务有关系???我找了下死锁发生原因相关的资料,也没有我这种情况就发生死锁的啊。
      

  2.   

    什么是数据库死锁 
         每个使用关系型数据库的程序都可能遇到数据死锁的情况。理解什么是死锁之前先要了解锁定的概念:如果需要“修改”一条数据,首先数据库管理系统会在上面加锁,以保证在同一时间只有一个事务能进行修改操作。锁定(Locking)发生在当一个事务获得对某一资源的“锁”时,这时,其他的事务就不能更改这个资源了,这种机制的存在是为了保证数据一致性。      多数情况下,可以认为如果一个资源被锁定,它总会在以后某个时间被释放。而死锁发生在当多个进程访问同一数据库时,其中每个进程拥有的锁都是其他进程所需的,由此造成每个进程都无法继续下去。简单的说,进程A等待进程B释放他的资源,B又等待A释放他的资源,这样就互相等待就形成死锁。 导致数据库死锁的原因 
         一般情况只发生锁超时,就是一个进程需要访问数据库表或者字段的时候,另外一个程序正在执行带锁的访问(比如修改数据),那么这个进程就会等待,当等了很久锁还没有解除的话就会锁超时,报告一个系统错误,拒绝执行相应的SQL操作。      发生死锁的情况比较少,比如一个进程需要访问两个资源(数据库表或者字段),当获取一个资源的时候进程就对它执行锁定,然后等待下一个资源空闲,这时候如果另外一个进程也需要两个资源,而已经获得并锁定了第二个资源,那么就会死锁,因为当前进程锁定第一个资源等待第二个资源,而另外一个进程锁定了第二个资源等待第一个资源,两个进程都永远得不到满足。 
    |||||||||||
    两个会话之间有可能会发生死锁,这个时候Oracle、 数据库会在警告日志中出现600号错误。
    但是死锁是不需要用户手工解锁的。因为Oracle、
     数据库会自动把死锁进程中的一个结束。
      

  3.   

    http://blog.csdn.net/ojuju10/archive/2009/09/27/4601150.aspx
      

  4.   

    请使用sqlplus 执行,目前很多DB工具在打开表数据时候,使用select  ... for update打开,从而导致死锁。
      

  5.   

    LZ语气这么嚣张干嘛,管你什么工具做的,插入删除都commit成功的话,肯定不会发生死锁,你在PL/SQL里试试insert但不提交,在同一会话中能查到这条记录,但是其他会话就无法查询,你怎么知道不是你没有提交事务的后果。
      

  6.   

    查询一下你的v$transaction表,如果有记录,证明有未提交事务,当然会堵塞