PDA

View Full Version : مشکل با قفل کردن رکورد



MNosouhi
دوشنبه 06 آذر 1385, 10:25 صبح
می خواهم در یه برنامه تحت شبکه اجازه ندهم یک رکورد همزمان توسط دو کاربر در حالت ویرایش قرار بگیره . برای اینکار LockType را روی ltPessimistic قرار دادم . اما باز هم 2 کاربر میتونن همزمان یک رکورد رو در حالت ویرایش قرار بدهند . پس باید چکار کرد؟
بانک sqlserver 2000 و از ado استفاده می کنم.

davoodmz
دوشنبه 06 آذر 1385, 11:25 صبح
با سلام خدمت دوستان
این سوال را من هم دارم لطفا راهنمایی فرمائید

mzjahromi
دوشنبه 06 آذر 1385, 11:55 صبح
باید یه کاری شبیه به این انجام بدید


CommandText:='Begin Transaction';
Execute;
CommandText:='Select ChildNo From TChild With (TabLockX) Where ChildNo='+IntToStr(I);
Active:=True;
....
CommandText:='Insert Into TChild(TNo,ChildNo,RecNo) Values('+IntTOStr(TNo)+','+IntTOStr(NewTNo)+','+In tToStr(CHNo)+')';
Execute;
CommandText:='Commit transaction';
execute;

البته اینجا کل جدول قفل شده شما بسته به نیاز خودتون میتونید نوع قفل رو مشخص کنید
انواع قفلها هم توی راهنمای اس کیو ال هست

MNosouhi
دوشنبه 06 آذر 1385, 17:27 عصر
خیلی ممنون آقای ذوالقدر
مشکلم حل شد :


with dm do
begin
try
ADOCommand1.CommandText:='Begin Transaction';
ADOCommand1.Execute;
ADOCommand1.CommandText:='Select PId From Person With (XLOCK) Where PId='+dm.ADODataSetPersonPId.AsString;
//UPDLOCK or HOLDLOCK
ADOCommand1.Execute;
ADODataSetPerson.Edit;
FormPerson:=TFormPerson.Create(nil);
FormPerson.ShowModal;//on this form data is edited an posted.
ADOCommand1.CommandText:='Commit transaction';
ADOCommand1.execute;
except
ADOCommand1.CommandText:='ROLLBACK TRANSACTION ';
ADOCommand1.execute;
ShowMessage('رکورد توسط کاربر دیگری در حال ویرایش است');
end;
end
الته چون هدف فقط قفل کردن یک رکورد است می توان از HOLDLOCK یا UPDLOCK یا XLOCK استفاده کرد .