我有一个简单的应用程序,有两个按钮。第一个按钮create transaction,在提交之前保持30秒。
第二个按钮execute方法,我试图更新相同的记录。
我的观点是获取有关锁定记录的信息,但在5-6秒后抛出异常。
在运行过程中,有关锁的信息会立即出现。
如何在C#中实现类似的效率?
private void button1_Click(object sender, RoutedEventArgs e)
{
Task.Run( () =>
{
using (OdbcConnection con = new OdbcConnection("DSN=myDSN;UID=root;PWD=qweasd"))
{
OdbcCommand command = new OdbcCommand();
OdbcTransaction transaction = null;
command.Connection = con;
try
{
con.Open();
while (con.State != ConnectionState.Open)
{
Thread.Sleep(10);
}
transaction = con.BeginTransaction();
command.Connection = con;
command.Transaction = transaction;
command.CommandText = " UPDATE pub.ad_mstr SET ad_line1 = 'button3' where ad_mstr.ad_addr = 'abcdefgh' ";
command.CommandTimeout = 1;
command.ExecuteNonQuery();
for (int i = 0; i < 30; i++)
{
Thread.Sleep(1000);
}
transaction.Commit();
}
catch (Exception exc)
{
try
{
transaction.Rollback();
}
catch
{
}
}
}
//_startedTransaction1 = true;
}); /* Task.Run ( () => */
}
private void button2_Click(object sender, RoutedEventArgs e)
{
if (!_startedTransaction1)
{
Task.Run(() =>
{
using (OdbcConnection con = new OdbcConnection("DSN=myDSN;UID=root;PWD=qweasd"))
{
OdbcCommand command = new OdbcCommand();
OdbcTransaction transaction = null;
command.Connection = con;
try
{
con.Open();
while (con.State != ConnectionState.Open)
{
Thread.Sleep(10);
}
transaction = con.BeginTransaction();
command.Connection = con;
command.Transaction = transaction;
command.CommandText = " UPDATE pub.ad_mstr SET ad_name = 'button1' where ad_mstr.ad_addr = 'abcdefgh' ";
command.ExecuteNonQuery();
transaction.Commit();
}
catch (Exception exc)
{
try
{
transaction.Rollback();
}
catch
{
}
}
//_startedTransaction1 = true;
}
});
}
else
{
//_startedTransaction1 = false;
}
}我想补充的是,我的'myDSN‘是提交的隔离级别。5-6秒后出现的异常情况为:
"System.Collections.ListDictionaryInternal pgoe1023.dll ERROR HY000ODBC Progress Wire Protocol driverFailure在表PUB.ad_mstr的记录上获取记录锁定。“
发布于 2016-02-16 13:53:39
看起来您应该在DB服务器上设置-SQLLockWaitTimeout参数:
http://knowledgebase.progress.com/articles/Article/What-is-the-SQLLockWaitTimeout-Parameter
https://stackoverflow.com/questions/35414272
复制相似问题