遇见的问题:
     应用环境:web程序发布到两台计算机上,连接同一个数据库,现在遇到的问题是:
     数据库中的一张表出现行锁,意思是:table_hsb(id,txt);对id为2的进行update,insert,delete操作时,后台不报错,但是数据库也没有修改,sql语句会锁住,用查询死锁的sql能查询出来。但是对id不为2的行操作时,是没有问题的。
     处理:把锁杀掉后,还是不能对id为2的数据进行操作,只要操作就会产生锁(ddl操作)。其中一台web服务器重启过,但没有解决掉问题。
      只是猜测和行锁有关,不知道这种锁的机制是什么?是如何操作产生的?在何种情况产生。求个大神指教。坐等回复Oracle数据库Web

解决方案 »

  1.   

    楼主的情况明显是DDL锁,这种锁其实就是加了表级锁,就是别的用户在DDL操作时候,你不可以去修改表。
    按照楼主说的情况,有可能产生了死锁,可以查看一下alter.log看看
      

  2.   

    只有对单独的一条记录进行操作的时候才会如此,对同一张表的其他数据操作不会死锁,应该不是表级锁,而且在执行ddl操作前查询不到锁。
      

  3.   

    你能从某张表查出来的锁都不是行级锁!
    行级锁不是Oracle一般意义上的锁、虽然有锁的功能,但是没有锁的开销
    在Oracle的每行数据上,都有一个标志位来表示该行数据是否被锁定,要查看某一行是否被锁定,必须直接找到这一行:dump 一个数据块、你会发现有个 Lck 字段、Lck字段就是行级锁的表示:1加锁,0不加锁你确认是否存在等待事件?
      

  4.   

    在 2 个web程序都做:commit
    然后试试
      

  5.   

    表锁是肯定的。因为你的不为2的这些行是可以更新。说明除了为2的情况下其他行锁没有被独占。所以只有为2的时候才存在独占锁,这说明两事务出现了相互等待对方的行锁的情况。如果出现表锁的话。10G以后有DDL锁等待DML锁的延迟。你可以设置一下延迟大小。但是这种情况只有行级别锁了。  在另外一个会话或事务中出现了为2的更新未提交。。找出那个未提交的就行了。。
      

  6.   

    问题已经找到,有两个weblogic进程,其中的一个weblogic连接到数据库做完数据提交,资源还没释放,另外的一个webologic又申请了该表的资源,然后第二个weblogic进程的数据提交,就会锁住,这是表锁,至于存在的行锁,应该是表锁后多次操作产生的(猜测),解决方法重启weblogic进程,使所有未提交的事件,以及服务与数据库连接都断开,数据库事务全部提交或者回滚,处理掉锁,问题就解决了