C# 为什么有关锁的信息在5-6秒后出现得如此晚?

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”)

我有一个简单的应用程序,它有两个按钮。 第一个按钮创建事务并在提交前保持30秒

第二个按钮执行方法,我尝试在其中更新相同的记录

我的目的是获取有关锁定记录的信息,但异常会在5-6秒后抛出

在进行过程中,有关锁的信息会立即出现

如何在C#中实现类似的效率

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;
        }

    }