C# 为什么有关锁的信息在5-6秒后出现得如此晚?
我有一个简单的应用程序,它有两个按钮。 第一个按钮创建事务并在提交前保持30秒 第二个按钮执行方法,我尝试在其中更新相同的记录 我的目的是获取有关锁定记录的信息,但异常会在5-6秒后抛出 在进行过程中,有关锁的信息会立即出现 如何在C#中实现类似的效率C# 为什么有关锁的信息在5-6秒后出现得如此晚?,c#,transactions,odbc,progress-4gl,openedge,C#,Transactions,Odbc,Progress 4gl,Openedge,我有一个简单的应用程序,它有两个按钮。 第一个按钮创建事务并在提交前保持30秒 第二个按钮执行方法,我尝试在其中更新相同的记录 我的目的是获取有关锁定记录的信息,但异常会在5-6秒后抛出 在进行过程中,有关锁的信息会立即出现 如何在C#中实现类似的效率 private void按钮1\u单击(对象发送者,路由目标) { Task.Run(()=> { 使用(OdbcConnection con=new-OdbcConnection(“DSN=myDSN;UID=root;PWD=qweasd”)
private void按钮1\u单击(对象发送者,路由目标)
{
Task.Run(()=>
{
使用(OdbcConnection con=new-OdbcConnection(“DSN=myDSN;UID=root;PWD=qweasd”))
{
OdbcCommand=新的OdbcCommand();
OdbcTransaction=null;
command.Connection=con;
尝试
{
con.Open();
while(con.State!=ConnectionState.Open)
{
睡眠(10);
}
事务=con.BeginTransaction();
command.Connection=con;
command.Transaction=事务;
command.CommandText=“UPDATE pub.ad_mstr SET ad_line1='button3',其中ad_mstr.ad_addr='abcdefgh';
command.CommandTimeout=1;
command.ExecuteNonQuery();
对于(int i=0;i<30;i++)
{
睡眠(1000);
}
Commit();
}
捕获(异常exc)
{
尝试
{
transaction.Rollback();
}
抓住
{
}
}
}
//_startedTransaction1=true;
});/*任务。运行(()=>*/
}
私有无效按钮2\u单击(对象发送者,路由目标)
{
如果(!\u启动事务1)
{
Task.Run(()=>
{
使用(OdbcConnection con=new-OdbcConnection(“DSN=myDSN;UID=root;PWD=qweasd”))
{
OdbcCommand=新的OdbcCommand();
OdbcTransaction=null;
command.Connection=con;
尝试
{
con.Open();
while(con.State!=ConnectionState.Open)
{
睡眠(10);
}
事务=con.BeginTransaction();
command.Connection=con;
command.Transaction=事务;
command.CommandText=“UPDATE pub.ad_mstr SET ad_name='button1',其中ad_mstr.ad_addr='abcdefgh';
command.ExecuteNonQuery();
Commit();
}
捕获(异常exc)
{
尝试
{
transaction.Rollback();
}
抓住
{
}
}
//_startedTransaction1=true;
}
});
}
其他的
{
//_startedTransaction1=false;
}
}
我想补充一点,我的“myDSN”具有承诺的隔离级别。
5-6秒后出现的异常为:
“System.Collections.ListDictionaryInternal pgoe1023.dll错误[HY000][DataDirect][ODBC Progress OpenEdge Wire Protocol driver][OpenEdge]无法从表PUB.ad_mstr中获取记录锁。”看起来您应该在DB服务器上设置-SQLLockWaitTimeout参数:
当记录上有锁时,您真的希望查询立即中止吗?如果有正常的更新,即使更新只花了一毫秒,如果另一个线程当时刚刚检查并立即放弃,您也会抛出错误。通常您希望立即解决死锁,但要等待正常的缓慢更新在抛出错误之前,我至少需要等待几秒钟。@JoachimIsaksson:我只需要尽快知道我的查询是否被锁定,然后可能会执行一些操作。但是我无论如何都不是进度大师,所以可能会遗漏一些东西。您试图解决的问题是什么?冲突的锁通常表示需要更改de符号。@JoachimIsaksson:我想这个参数是用于其他东西的。在进行过程中,我可以立即获得关于锁的信息,这个参数表示在投降之前需要等待多长时间。就像我说的,关于记录锁的信息会立即出现。如果5秒是这个参数的最小值,我想我无法获得更快的恢复速度输入有关锁的信息。
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;
}
}