T
trybird
Unregistered / Unconfirmed
GUEST, unregistred user!
十万万火急!!!C++ Builder数据集以CachedUpdates方式(多人使用时)提交到SQL Server数据库为什么总是产生死锁(DeadLock)?(200分)<br />C++ Builder 5.0 在 SQL Server 7.0环境下编程,数据集以CachedUpdates属性为true方式(多人使用时)
提交到SQL Server数据库,为什么总是产生死锁(DeadLock)?
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Fmain->Database1->StartTransaction();
//Database1的DatabaseName属性是SQL SERVER服务器中的一个数据库名;
Fmain->Database2->StartTransaction();
//Database2的DatabaseName属性是同一个SQL SERVER服务器中的另一个数据库名;
try
{
DataModule1->Table1->ApplyUpdates();//Error4
//DataMocule1是Database1的一个数据模块,
DataModule2->Table2->ApplyUpdates();/*Error3:EDBEngineError with message
'lock time out,SQLServer connection time out'*/
//DataMocule2是Database2的一个数据模块,Table1和Table2所指向的表结构相同,内容一致。
Fmain->Database1->Commit();
Fmain->Database2->Commit();
}
catch(Exception &E)
{
Fmain->Database1->Rollback();
Fmain->Database2->Rollback();
throw;
}
DataModule2->Table2->CommitUpdates();
//Error1:BLOB not opened. Error2:Record already locked by this session.
DataModule1->Table1->CommitUpdates();
}
return;
}
出错提示:
Error1: BLOB not opened.
Error2:Record already locked by this session.
Error3:EDBEngineError with message 'lock time out,SQLServer connection time out'.
Error4:同Error3
在几个人同时用时,这段代码在会出现异常,大致规律是:
第一次:出现Error1错误。
第二次:出现Error2错误。
第三次:在SQL沙漏光标停留五六分钟后,出现Error3错误。
第三次以后:重复第三次的错误。
(有时又没有规律,直接出现Error3错误。而且在Error4处也会出现Error3的问题。)
重启SQL SERVER后正常,但不久有出现以上问题。
我的问题是:这段代码有什么不妥之处?如何缩短死锁异常的时间(五六分钟太长)?
提交到SQL Server数据库,为什么总是产生死锁(DeadLock)?
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Fmain->Database1->StartTransaction();
//Database1的DatabaseName属性是SQL SERVER服务器中的一个数据库名;
Fmain->Database2->StartTransaction();
//Database2的DatabaseName属性是同一个SQL SERVER服务器中的另一个数据库名;
try
{
DataModule1->Table1->ApplyUpdates();//Error4
//DataMocule1是Database1的一个数据模块,
DataModule2->Table2->ApplyUpdates();/*Error3:EDBEngineError with message
'lock time out,SQLServer connection time out'*/
//DataMocule2是Database2的一个数据模块,Table1和Table2所指向的表结构相同,内容一致。
Fmain->Database1->Commit();
Fmain->Database2->Commit();
}
catch(Exception &E)
{
Fmain->Database1->Rollback();
Fmain->Database2->Rollback();
throw;
}
DataModule2->Table2->CommitUpdates();
//Error1:BLOB not opened. Error2:Record already locked by this session.
DataModule1->Table1->CommitUpdates();
}
return;
}
出错提示:
Error1: BLOB not opened.
Error2:Record already locked by this session.
Error3:EDBEngineError with message 'lock time out,SQLServer connection time out'.
Error4:同Error3
在几个人同时用时,这段代码在会出现异常,大致规律是:
第一次:出现Error1错误。
第二次:出现Error2错误。
第三次:在SQL沙漏光标停留五六分钟后,出现Error3错误。
第三次以后:重复第三次的错误。
(有时又没有规律,直接出现Error3错误。而且在Error4处也会出现Error3的问题。)
重启SQL SERVER后正常,但不久有出现以上问题。
我的问题是:这段代码有什么不妥之处?如何缩短死锁异常的时间(五六分钟太长)?