gpt4 book ai didi

c# - 为什么此更新会锁定 Oracle 10 中的行?

转载 作者:行者123 更新时间:2023-11-30 19:33:42 25 4
gpt4 key购买 nike

这是代码(删除了服务器/密码等)

  public int SetUploadedInESIDatabase(string ID)
{
using (var oOracleConn = new OracleConnection())
{
oOracleConn.ConnectionString =
@"Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=<ip>)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=<dbname>)));User Id=<user>;Password=<password>;";
var cmd =
new OracleCommand(
"UPDATE FOO_ACCESS SET PIMAGE ='-1' WHERE CODE= '" + ID + "'", oOracleConn);

oOracleConn.Open();



return cmd.ExecuteNonQuery();

}
}

这段代码的效果是它永远不会通过 return 语句。没有返回错误(甚至一夜之间)

我不是数据库专家,但我们压力很大的 DBA 说连接被锁定(或者行可能......)他杀死了锁定连接,但当我运行代码时它仍然锁定。

关于要求 Oracle 更新行,我做错了吗?

我意识到我应该使用参数化查询,但我对此有疑问并且需要简单的东西!如果我将构建的命令从 cmd 中复制出来。使用调试器并使用 SQL Developer 运行它然后它就可以工作了(尽管有时它也会锁定)

我可以随意从数据库中选择。

我不确定这是正常现象还是与我们的环境有关,所以很乐意接受任何帮助!

最佳答案

结合@Tony 和@Panagiotis 的答案,并扩展:

您在哪里提交在此代码中完成的更新?确定完成了吗?

这会是您的场景吗:

  1. 您发出上述更新,但从未提交。
  2. 您没有看到您的更改,所以您再试一次。现在挂起。

受 UPDATE 影响的行被锁定以防止进一步更新,直到提交或回滚。如果您从未明确提交或回滚,后续更新将挂起。

如果你想避免代码中的挂起,那么执行一个

SELECT... FOR UPDATE NOWAIT;

在您进行更新之前。如果记录被锁定,select 将返回一个错误,您可以捕获并处理该错误。

让您的 DBA 尝试这个查询(感谢 Tom Kyte):

select
(select username from v$session where sid=a.sid) blocker,
a.sid,
' is blocking ',
(select username from v$session where sid=b.sid) blockee,
b.sid
from v$lock a join v$lock b on (a.id1 = b.id1 and a.id2 = b.id2)
where a.block = 1
and b.request > 0;

查看 session 中所有排队的 block 。

关于c# - 为什么此更新会锁定 Oracle 10 中的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3187514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com