本文主要是介绍OracleCommand执行ExecuteNonQuery出现程序挂起现象,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
string sql = "INSERT INTO TempTable (A, B, C) VALUES ('2222222', '1111111', 'RRR')";//A为主键
OracleCommand cmd = new OracleCommand(sql, connection);
cmd.ExecuteNonQuery();
在执行这段代码的时候,第一次插入没有成功,当Stop Debug再重新启动的时候,发现程序运行到cmd.ExecuteNonQuery的时候就卡住不动了。造成这个的原因是Oracle的block机制。
If session "A" inserts a row in a table with a primary key, session "A" will block ANY other session attempting to insert the same primary key until session "A" commits or rolls back the insert. All other attempts to insert will "hang".
此时我在代码中把sql语句主键2222222换成33333333,那么就能顺利插入。说明只有在相同的主键情况下,这个操作才会被block. 因为以前插入2222222的时候,程序意外结束,但是对于Oracle端事务并没有提交或者回滚,所以就锁定了这一个主键。注意,仅仅是这一个值的主键。
这里还有一个问题,就是现在我打开SQL Developer,执行插入2222222的主键语句,会顺利的执行完成,不发生卡住现在,而用代码执行SQL语句还是会发生卡住现象。但是我重启VS,新建一个项目,写入这些代码,也相当于另外的一个程序来执行这个插入语句,也是会有卡住现象。可能跟使用的.net provider有关?因为使用的是同一个Provider,所以卡住。因为SQL Developer没有使用这个provider,所以不会卡住?这只是一个猜测。
这种lock叫做TMlock,也叫row transaction lock, 可以使用SQL语句查看是否有这种lock
SELECT sid, id1 FROM v$lock WHERE TYPE='TM'
SID ID1
76 14197
SELECT * FROM dba_objects WHERE object_id = 14197;
OBJECT_NAME
--------------------------------------------------------------------------------------------------------------------------------
TemTable
如何解除这个TM lock?row transaction lock
在SQL Developer UI执行一个Commit命令就行了。
这篇关于OracleCommand执行ExecuteNonQuery出现程序挂起现象的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!