0

我有 C# windows application.When 'Button 1' click in 'Form 1' 我有一个将数据写入几个表的过程。该过程通常需要 10 分钟。当一个用户单击该“按钮 1”时,另一个使用相同数据库和程序的用户单击另一种形式的另一个按钮,该按钮将数据插入到相同的表中。

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

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

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

4

3 回答 3

4

我能为此做些什么?

重新处理您的事务处理。严重地。

该过程通常需要 10 分钟

无论如何,10 分钟的交易是不切实际的。我看不出有什么原因造成这种外部不良的概念化——我从事数据库工作总共可能有 20 年。从来没有容忍过并且真正需要这么长时间的交易,通常有办法解决它。

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

从逻辑的角度重新处理您的事务。你在那里做什么需要 10 分钟才能开始?

于 2014-04-11T05:57:18.810 回答
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...";
    }

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

谢谢

于 2014-04-11T06:03:22.900 回答
0

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

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

您还可以检查您的事务是否阻塞太多,但如果第二个进程确实需要访问相同的资源,则必须等待。

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

于 2014-04-11T05:55:52.717 回答