使用C#进行SQL事务

时间:2014-04-11 05:49:01

标签: c# sqltransaction

我有C#windows应用程序。当按钮1'点击表格1'我有一个将数据写入少数表的过程。这个过程通常需要10分钟。 当一个用户点击该按钮1' ,另一个用户使用相同的数据库和程序点击另一种形式的另一个按钮,将数据插入到同一个表中。

当按钮1点击我开始SQL事务并在完成该过程后提交时。

问题是在运行该过程时,第二个用户出现超时错误并且他无法完成他的过程。

我能为此做些什么? SQL事务启动时是否锁定了用于进程的表?

3 个答案:

答案 0 :(得分:4)

  

我能为此做些什么?

重做您的交易处理。严重。

  

这个过程通常需要10分钟

10分钟的交易无论如何都是不切实际的。我没有看到任何出于这种外部错误概念的原因 - 我总共做了20年的数据库工作。永远不会容忍并且真正需要长时间的交易,通常有一种解决方法。

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

从逻辑的角度重写您的交易。那你需要花10分钟开始做什么?

答案 1 :(得分:1)

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

如果您使用线程来完成此操作(winform),并将label1作为工作状态

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

这是我通常处理错误的方式,我无法解决它。

由于

答案 2 :(得分:0)

根据定义,事务阻止其他事务访问相同的资源,因为它是SQL服务器保证数据在提交时保持不变并且不会被其他人更改的方式。这是

所以 - 你可以做的是让你的交易运行得更快,所以它不会阻塞和锁定很长时间。 申请更长时间等待第二个用户。 或根本不使用交易。 (或者在代码层中处理“更好”的情况,如果它是“预期行为”)

您还可以检查不会阻止太多的交易,但如果第二个流程确实需要访问相同的资源,则必须等待。

但是,如果真的想要“脏”,你可以改变服务器的隔离级别以允许读取脏数据,但除非你知道你在做什么,否则这绝对不是我建议的。但它可以加速读取查询,但是读取脏数据和脏数据页会产生相当奇怪的后果。