我像Oralce的一个表中插入一条记录,INSERT INTO TempTable (A, B, C) VALUES ('2222222', '1111111', 'RRR'),A为主键。
这是通过C#代码实现,因为操作不当,造成了一个TM锁,事务既没有提交也没有回滚。
当我再次执行这段代码的时候,会发现程序一直处于挂起等待的状态,因为在执行SQL语句的时候,这条记录已经被上一个Session锁住了。
我使用SQL Devepoler的UI界面端使用同样的SQL语句,就不会出现卡住的现象,这是为什么啊?
还有我在SQL Developer执行一个commit命令,C#端的代码也就运行通过了。
------解决方案--------------------
这是由于oracle锁机制导致的,为了数据一致性。
因为此时TM锁是共享的,所以你可以通过另个会话操作。
你操作行的时候会获得行锁,行锁只有排它锁。如果两个
会话同时更新一行,且都没有提交,后一个更新的会出现
一直等待。只有前一个提交或回滚才能释放改行的行锁。
------解决方案--------------------
杀死锁呀,
SELECT A.SID,A.SERIAL#,A.USERNAME,B.TYPE FROM V$SESSION A,V$LOCK B WHERE A.SID=B.SID;
ALTER SYSTEM KILL SESSION 'SID,SERIAL#';