当我使用“选择...进行更新”时,查询代码会毫无例外地停止或任何冻结。它只是不会去下一个指令。它适用于常规选择查询。知道为什么吗?
string selectQuery = "select * from table_name where id = 1 FOR UPDATE"; // Code stops on data fill
string selectQueryNoLock = "select * from table_name where id = 1"; // Code execute normally
string connectionString = "fake";
OracleConnection oracleConnection = new OracleConnection(connectionString);
Console.WriteLine("Open Connection");
oracleConnection.Open();
OracleTransaction oracleTransaction = oracleConnection.BeginTransaction();
OracleCommand oracleCommand = new OracleCommand(selectQuery, oracleConnection);
oracleCommand.Transaction = oracleTransaction;
OracleDataAdapter dataAdapter = new OracleDataAdapter(oracleCommand);
DataSet dataSet = new DataSet();
dataAdapter.Fill(dataSet);
// This line is never reached!
Console.WriteLine("Press any key...");
答案 0 :(得分:1)
如果另一个事务当前持有该行的锁定,则标准select ... for update
将无限期等待。在普通应用程序中,这不是一个真正的问题,因为事务应该是短暂的。
但是,如果无限期等待不是您想要的行为,并且您宁愿被告知在一定时间后您是否无法获得锁定,则可以指定如下的超时:
select ... for update wait 10
...如果超时超时并且您无法获得锁定,将返回错误。
或者,如果您根本不想等,也可以这样做:
select ... for update nowait
...如果您无法立即获得锁定,将立即返回错误。