Y
yuking_cc
Unregistered / Unconfirmed
GUEST, unregistred user!
说明:
动态创建的线程中包含带有事务处理的数据库操作,当开多个线程是,总是不固定地出现
进程被死锁并被牺牲的情况,如何处理?
程序代码:
procedure TSnatchThread.SaveRawSource(sBody: string);//保存网页源代码
var
adosp: TADOStoredProc;
adoq, adoq2: TADOQuery;
sSql, sSql2: string;
sPageID, sPageAddr: string;
begin
adoq := TADOQuery.Create(nil);
adoq.Connection := adocn2;
adoq2 := TADOQuery.Create(nil);
adoq2.Connection := adocn2;
adosp := TADOStoredProc.Create(nil);
adosp.Connection := adocn2;
adosp.ProcedureName := 'InsertTextRaw';
with adosp.Parameters.AddParameterdo
begin
Name := '@id_value';
DataType := ftInteger;
Direction := pdInput;
end;
//with
with adosp.Parameters.AddParameterdo
begin
Name := '@insert_cont';
DataType := ftWideString;
Direction := pdInput;
Size := 1073741823;
end;
//with
with adosp.Parameters.AddParameterdo
begin
Name := '@web_id';
DataType := ftInteger;
Direction := pdInput;
end;
//with
//--------------------------------------------------------------------------//
sPageAddr := StringReplace(s_Addr, '''', '''''', [rfReplaceAll]);
//插入新地址
adoq.Close;
adoq.SQL.Clear;
sSql := 'insert into ws_page_addr_raw(ws_id,ws_page_addr) values('+s_WebID+','''+sPageAddr+''')';
adoq.SQL.Add(sSql);
//产生新文章ID号
adoq2.Close;
adoq2.SQL.Clear;
sSql2 := 'select top 1 arti_id from information where arti_web = '+s_WebID+' order by arti_id desc';
adoq2.SQL.Add(sSql2);
sPageID := '1';
try
adoq2.Open;
if adoq2.RecordCount > 0 then
sPageID := IntToStr(adoq2.FieldByName('arti_id').AsInteger + 1);
except
on E: Exceptiondo
begin
WriteLog('['+s_WebID+']Select:'+E.Message, 'Error_SaveRawSource.txt');
end;
//on
end;
//try
//插入文章基本信息
adoq2.Close;
adoq2.SQL.Clear;
sSql2 := 'insert into information(arti_web,arti_id,i_address,i_content_raw,i_done) values('+s_WebID+','+sPageID+','''+sPageAddr+''',''LXQ'',0)';
adoq2.SQL.Add(sSql2);
//插入原文
adosp.Parameters.ParamByName('@id_value').Value := StrToInt(sPageID);
adosp.Parameters.ParamByName('@insert_cont').Value := sBody;
adosp.Parameters.ParamByName('@web_id').Value := StrToInt(s_WebID);
adocn2.begin
Trans;//开始事务
try
adoq.ExecSQL;
adoq2.ExecSQL;
adosp.ExecProc;
adocn2.CommitTrans;//提交事务
except
on E: Exceptiondo
begin
adocn2.RollbackTrans;//回滚事务
WriteLog('['+s_WebID+']Trans:'+E.Message, 'Error_SaveRawSource.txt');
end;
//on
end;
//--------------------------------------------------------------------------//
adoq.Close;
adoq.Free;
adoq2.Close;
adoq2.Free;
adosp.Free;
end;
错误提示:
[程序号:1][2002-8-2 11:25:11]:Select:事务(进程 ID 109)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:11]:Select:事务(进程 ID 83)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:12]:[1077]Trans:事务(进程 ID 85)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:12]:[1077]Trans:事务(进程 ID 91)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:12]:[1077]Trans:事务(进程 ID 79)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:12]:[1077]Trans:事务(进程 ID 81)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:12]:[1077]Trans:事务(进程 ID 121)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:14]:Select:事务(进程 ID 133)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:14]:[1077]Trans:事务(进程 ID 103)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:14]:Select:事务(进程 ID 123)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:14]:[1077]Trans:事务(进程 ID 101)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:14]:Select:事务(进程 ID 137)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:14]:[1077]Trans:事务(进程 ID 99)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:14]:[1077]Trans:事务(进程 ID 97)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:14]:[1077]Trans:事务(进程 ID 83)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:15]:[1077]Trans:事务(进程 ID 137)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:15]:Select:事务(进程 ID 151)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:15]:[1077]Trans:事务(进程 ID 123)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:15]:Select:事务(进程 ID 139)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:15]:[1077]Trans:事务(进程 ID 133)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:15]:[1077]Trans:事务(进程 ID 131)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:15]:Select:事务(进程 ID 147)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
动态创建的线程中包含带有事务处理的数据库操作,当开多个线程是,总是不固定地出现
进程被死锁并被牺牲的情况,如何处理?
程序代码:
procedure TSnatchThread.SaveRawSource(sBody: string);//保存网页源代码
var
adosp: TADOStoredProc;
adoq, adoq2: TADOQuery;
sSql, sSql2: string;
sPageID, sPageAddr: string;
begin
adoq := TADOQuery.Create(nil);
adoq.Connection := adocn2;
adoq2 := TADOQuery.Create(nil);
adoq2.Connection := adocn2;
adosp := TADOStoredProc.Create(nil);
adosp.Connection := adocn2;
adosp.ProcedureName := 'InsertTextRaw';
with adosp.Parameters.AddParameterdo
begin
Name := '@id_value';
DataType := ftInteger;
Direction := pdInput;
end;
//with
with adosp.Parameters.AddParameterdo
begin
Name := '@insert_cont';
DataType := ftWideString;
Direction := pdInput;
Size := 1073741823;
end;
//with
with adosp.Parameters.AddParameterdo
begin
Name := '@web_id';
DataType := ftInteger;
Direction := pdInput;
end;
//with
//--------------------------------------------------------------------------//
sPageAddr := StringReplace(s_Addr, '''', '''''', [rfReplaceAll]);
//插入新地址
adoq.Close;
adoq.SQL.Clear;
sSql := 'insert into ws_page_addr_raw(ws_id,ws_page_addr) values('+s_WebID+','''+sPageAddr+''')';
adoq.SQL.Add(sSql);
//产生新文章ID号
adoq2.Close;
adoq2.SQL.Clear;
sSql2 := 'select top 1 arti_id from information where arti_web = '+s_WebID+' order by arti_id desc';
adoq2.SQL.Add(sSql2);
sPageID := '1';
try
adoq2.Open;
if adoq2.RecordCount > 0 then
sPageID := IntToStr(adoq2.FieldByName('arti_id').AsInteger + 1);
except
on E: Exceptiondo
begin
WriteLog('['+s_WebID+']Select:'+E.Message, 'Error_SaveRawSource.txt');
end;
//on
end;
//try
//插入文章基本信息
adoq2.Close;
adoq2.SQL.Clear;
sSql2 := 'insert into information(arti_web,arti_id,i_address,i_content_raw,i_done) values('+s_WebID+','+sPageID+','''+sPageAddr+''',''LXQ'',0)';
adoq2.SQL.Add(sSql2);
//插入原文
adosp.Parameters.ParamByName('@id_value').Value := StrToInt(sPageID);
adosp.Parameters.ParamByName('@insert_cont').Value := sBody;
adosp.Parameters.ParamByName('@web_id').Value := StrToInt(s_WebID);
adocn2.begin
Trans;//开始事务
try
adoq.ExecSQL;
adoq2.ExecSQL;
adosp.ExecProc;
adocn2.CommitTrans;//提交事务
except
on E: Exceptiondo
begin
adocn2.RollbackTrans;//回滚事务
WriteLog('['+s_WebID+']Trans:'+E.Message, 'Error_SaveRawSource.txt');
end;
//on
end;
//--------------------------------------------------------------------------//
adoq.Close;
adoq.Free;
adoq2.Close;
adoq2.Free;
adosp.Free;
end;
错误提示:
[程序号:1][2002-8-2 11:25:11]:Select:事务(进程 ID 109)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:11]:Select:事务(进程 ID 83)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:12]:[1077]Trans:事务(进程 ID 85)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:12]:[1077]Trans:事务(进程 ID 91)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:12]:[1077]Trans:事务(进程 ID 79)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:12]:[1077]Trans:事务(进程 ID 81)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:12]:[1077]Trans:事务(进程 ID 121)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:14]:Select:事务(进程 ID 133)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:14]:[1077]Trans:事务(进程 ID 103)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:14]:Select:事务(进程 ID 123)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:14]:[1077]Trans:事务(进程 ID 101)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:14]:Select:事务(进程 ID 137)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:14]:[1077]Trans:事务(进程 ID 99)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:14]:[1077]Trans:事务(进程 ID 97)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:14]:[1077]Trans:事务(进程 ID 83)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:15]:[1077]Trans:事务(进程 ID 137)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:15]:Select:事务(进程 ID 151)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:15]:[1077]Trans:事务(进程 ID 123)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:15]:Select:事务(进程 ID 139)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:15]:[1077]Trans:事务(进程 ID 133)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:15]:[1077]Trans:事务(进程 ID 131)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。
[程序号:1][2002-8-2 11:25:15]:Select:事务(进程 ID 147)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。