今天在操作数据库的时候某个表的数据的时候,更新数据就会卡在那边。不论是用sqldeveloper或则是sqlplus,但是操作其它表的操作确很快。
那个表格产生锁的原因找到了,在2011年10月19号晚上网络上看到一篇文章讲外键没有设置索引所引发表的死锁问题。
看一下那个死锁的表,确实那个表格上面有5个外键,有可能是这个引发的原因。但是如果特意去操作那些有外键的表,但是又不会产生死锁,可能取决于资源的操作量。
解决表死锁的方法
方法一:最简单的方法是数据库重启,在linux终端,oracle用户登录。
export ORACLE_SID=所要重启的数据库的SID
sqlplus / as sysdba
shutdown immediate
startup;
表的死锁就解决了。但是很多时候数据库是不能够重启的。
方法二:查询死锁对象的linux进程编号,删除相关的进程
SQL> col OS_USER_NAME format a10;
SQL> col process format a10;
SQL> select * from v$locked_object;
XIDUSN XIDSLOT XIDSQN OBJECT_ID SESSION_ID ORACLE_USE OS_USER_NA PROCESS LOCKED_MODE
----------
0 0 0 88523 130 SYS oracle 7643 3
SQL> quit
#kill 7643
现在虽然不用重启,但是还是会经常死锁。
方法三:给字表的外键加索引
想要彻底解决上面表外键引发的死锁的解决方法是,给子标的外键加索引,就可以。
总结:在碰到锁问题的时候除了查数据库锁对象之外最好也要会先分析一下,自己的表的设计结构。如果会去查看trace.log是最好的。马上知道问题。