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命令就行了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值