我有C#windows应用程序。当按钮1'点击表格1'我有一个将数据写入少数表的过程。这个过程通常需要10分钟。 当一个用户点击该按钮1' ,另一个用户使用相同的数据库和程序点击另一种形式的另一个按钮,将数据插入到同一个表中。
当按钮1点击我开始SQL事务并在完成该过程后提交时。
问题是在运行该过程时,第二个用户出现超时错误并且他无法完成他的过程。
我能为此做些什么? SQL事务启动时是否锁定了用于进程的表?
答案 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服务器保证数据在提交时保持不变并且不会被其他人更改的方式。这是
所以 - 你可以做的是让你的交易运行得更快,所以它不会阻塞和锁定很长时间。 申请更长时间等待第二个用户。 或根本不使用交易。 (或者在代码层中处理“更好”的情况,如果它是“预期行为”)
您还可以检查不会阻止太多的交易,但如果第二个流程确实需要访问相同的资源,则必须等待。
但是,如果真的想要“脏”,你可以改变服务器的隔离级别以允许读取脏数据,但除非你知道你在做什么,否则这绝对不是我建议的。但它可以加速读取查询,但是读取脏数据和脏数据页会产生相当奇怪的后果。