MNosouhi
چهارشنبه 09 اسفند 1385, 12:52 عصر
امروز به یه باگ تابلو توی dbisam برخورد کردم ، به این صورت که اگه از DBISAMUpdateSQL برای Update یه جدول در داخل Transaction استفاده کنید برنامتون قفل می کنه ، به کد زیر توجه کنید :
procedure TForm1.Button7Click(Sender: TObject);
var s:TStrings;
begin
try
s:=TStringList.Create;
s.Add('ser');
ADOConnection.StartTransaction(s);
Try
TableSer.Cancel;
DBISAMUpdateSQL1.SQL[ukModify].Clear;
DBISAMUpdateSQL1.SQL[ukModify].Add('Update "'+ExtractFileDir(Application.ExeName)+'\d\ser'+'"');
DBISAMUpdateSQL1.SQL[ukModify].Add('Set SCCode='+Trim(Edit1.Text));
DBISAMUpdateSQL1.SQL[ukModify].Add('where SCode='+Trim(Edit2.Text));
DBISAMUpdateSQL1.Apply(ukModify);
TableSer.Refresh;
ADOConnection.Commit;
except
ADOConnection.Rollback;
ShowMessage('Errore');
end;
finally
s.Free;
end;
end;
همونطوری که میبینید فقط یک دستور Update ساده در داخل یه transaction نوشته شده ، اما اگه تستش کنید میبینید که برنامتون قفل می کنه ، وقتی داخل سورس dbisam رو برای پیدا کردن علت قفل کردن برنامه بررسی کردم متوجه شدم که خود دستور update از transaction ها استفاده می کنه ، اما چون دو تا Transaction نمی تونن همزمان بر روی یک جدول کار کنن ، بنابر این transaction ناشی از دستور Update منتظر میشه تا Transaaction ی که در کد بالا خودمون ایجاد کردیم تموم بشه ، تموم شدن Transaction ی هم که خودمون نوشتیم مشزوط بر اینه که دستور Update انجام بشه و اینجا یه حلقه بوجود میاد که هر کدوم منظر تموم شدن کار دیگری هستش (بن بست ) .
حالا من نمیدونم که چطوری باید این مشکل رو برطرف کنم ، چونکه واقعا بهش احتیاج دارم ، اگه دوستان قبلا با این مشکل برخورد کردن و جوابی براش دارن کمک کنن.
ضمنا از نسخه 4.19 استفاده میکنم.
procedure TForm1.Button7Click(Sender: TObject);
var s:TStrings;
begin
try
s:=TStringList.Create;
s.Add('ser');
ADOConnection.StartTransaction(s);
Try
TableSer.Cancel;
DBISAMUpdateSQL1.SQL[ukModify].Clear;
DBISAMUpdateSQL1.SQL[ukModify].Add('Update "'+ExtractFileDir(Application.ExeName)+'\d\ser'+'"');
DBISAMUpdateSQL1.SQL[ukModify].Add('Set SCCode='+Trim(Edit1.Text));
DBISAMUpdateSQL1.SQL[ukModify].Add('where SCode='+Trim(Edit2.Text));
DBISAMUpdateSQL1.Apply(ukModify);
TableSer.Refresh;
ADOConnection.Commit;
except
ADOConnection.Rollback;
ShowMessage('Errore');
end;
finally
s.Free;
end;
end;
همونطوری که میبینید فقط یک دستور Update ساده در داخل یه transaction نوشته شده ، اما اگه تستش کنید میبینید که برنامتون قفل می کنه ، وقتی داخل سورس dbisam رو برای پیدا کردن علت قفل کردن برنامه بررسی کردم متوجه شدم که خود دستور update از transaction ها استفاده می کنه ، اما چون دو تا Transaction نمی تونن همزمان بر روی یک جدول کار کنن ، بنابر این transaction ناشی از دستور Update منتظر میشه تا Transaaction ی که در کد بالا خودمون ایجاد کردیم تموم بشه ، تموم شدن Transaction ی هم که خودمون نوشتیم مشزوط بر اینه که دستور Update انجام بشه و اینجا یه حلقه بوجود میاد که هر کدوم منظر تموم شدن کار دیگری هستش (بن بست ) .
حالا من نمیدونم که چطوری باید این مشکل رو برطرف کنم ، چونکه واقعا بهش احتیاج دارم ، اگه دوستان قبلا با این مشکل برخورد کردن و جوابی براش دارن کمک کنن.
ضمنا از نسخه 4.19 استفاده میکنم.