我有c #windows应用程序。当'按钮1'点击'表单1'时,我有一个写入数据到几个表的过程。这一过程通常需要10分钟。 当一个用户单击该“按钮1”时,另一个用户使用相同的DB和程序单击另一个表单中的另一个按钮,该表单将数据插入相同的表格。

当按钮1单击时,我启动SQL事务并在完成过程后提交。

问题是运行该过程时,第二个用户获得超时错误,他无法完成他的进程。

我该怎么做? 当SQL事务启动时,他们将锁定使用此过程的表?

有帮助吗?

解决方案

我能为此做些什么?

返工您的交易处理。认真。

通常需要10分钟

通过任何手段,10分钟的交易不实用。我没有看到这个外部的任何原因,不错的一般性化 - 我正在做20年的数据库工作。从不容忍并且真正需要交易那么长时间,通常情况下有一种方法。

是的,您可以更改超时,但这意味着用户2在屏幕上盯着15分钟。不是真实的解决方案。

从逻辑的角度返回您的交易。你在那里做什么需要10分钟的时间才能开始?

其他提示

简单解决方案但可能需要用户等待很长时间。

如果您使用的是线程以使用Label1完成此(WinForm)作为工作状态

   void transaction(data)
    { 
     try
     {
       thread.sleep(100);
       sqltransaction(data);//whatever your code is
     }
    catch(Exception)
     {
       transaction(data);
       label1.Invoke((MethodInvoker)(() => label1.Text = "Requested pending , do not close the program";
     }
       label1.Invoke((MethodInvoker)(() => label1.Text = "Working...";
    }
.

这是我通常处理错误的方式,即我无法真正修复它。

感谢

事务是根据定义阻止其他事务访问相同资源的访问,因为它是SQL Server保证数据在提交时持久的方式,而不是由其他人更改。这是

所以 - 您可以做的是使您的事务运行得更快,因此它不会阻止并锁定。 应用更长的等待第二个用户。 或者根本不使用交易。 (或处理代码层中的“更好”的情况,如果它是“预期行为”)

您还可以检查您的交易它不会阻止太多,但如果第二个进程真的需要访问相同的资源,它将不得不等待。

但是,如果真的想要获得“脏”,您可以更改服务器的隔离级别以允许读取脏数据,但这绝对不是我建议的,除非您知道您正在做什么。但它可以加快读取查询的东西,但它可以读取脏数据和脏数据页面的相当奇怪的后果。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top