Oracle DataAccess锁定代码停止

时间:2016-06-08 10:49:34

标签: c# oracle

当我使用“选择...进行更新”时,查询代码会毫无例外地停止或任何冻结。它只是不会去下一个指令。它适用于常规选择查询。知道为什么吗?

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...");

1 个答案:

答案 0 :(得分:1)

如果另一个事务当前持有该行的锁定,则标准select ... for update将无限期等待。在普通应用程序中,这不是一个真正的问题,因为事务应该是短暂的。

但是,如果无限期等待不是您想要的行为,并且您宁愿被告知在一定时间后您是否无法获得锁定,则可以指定如下的超时:

select ... for update wait 10

...如果超时超时并且您无法获得锁定,将返回错误。

或者,如果您根本不想等,也可以这样做:

select ... for update nowait

...如果您无法立即获得锁定,将立即返回错误。