题
我有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保证数据在提交时持久的方式,而不是由其他人更改。这是
所以 - 您可以做的是使您的事务运行得更快,因此它不会阻止并锁定。 应用更长的等待第二个用户。 或者根本不使用交易。 (或处理代码层中的“更好”的情况,如果它是“预期行为”)
您还可以检查您的交易它不会阻止太多,但如果第二个进程真的需要访问相同的资源,它将不得不等待。
但是,如果真的想要获得“脏”,您可以更改服务器的隔离级别以允许读取脏数据,但这绝对不是我建议的,除非您知道您正在做什么。但它可以加快读取查询的东西,但它可以读取脏数据和脏数据页面的相当奇怪的后果。