前些日子,一直在做并发访问的事.可是,不管是对表还中数据进行锁定,都不能得到想要达到的结果.后来想了想,用了对数据进行标识进行处理:
步骤:
一:刚开始去更改的时候,去查一个未处理的ID,获取此ID。
二:把文件ID记录下来。然后去把这个未处理的记录设置为正在处理、并记录下当前正在处理的者的ID。
三:根据这个状态为正在处理的、文件ID进行查询
四:对这个文件的修改者进行身份判断。看是否为当前用户。要是的话,就进行正常操作。不是的话,就放弃处理(在客户端进行提示、服务器就放弃处理,进行下一次处理。)。
//将未处理处理完的申请置为正在处理
WITH query3 DO
begin
close;
sql.Clear;
sql.Add('UPDATE FileInfo SET file_state=:file_state, processID=:processID,ProcessName=:processName ');
sql.Add(' where file_state="未处理" and file_id='+query1.fieldbyname('file_id').AsString);
paramByName('processID').AsInteger:=mainform.user_id;//将操作员置未当前用户
paramByName('processName ').asstring:=mainform.user_Name;
paramByName('file_state').AsString:='正在处理';
prepare;
execSql;
end;
//查询选择的文件信息
WITH query3 DO
begin
close;
sql.Clear;
sql.Add('select * from FileInfo ');
sql.Add(' where file_state="正在处理" and file_id='+query1.fieldbyname('file_id').AsString);
prepare;
open;
end;
查询选择的文件的修改者是否为当前用户---------------
if (query3.FieldByName('porcessID').AsInteger=mainform.user_id) then
begin
……正常操作
end
else
begin
……忽略或者告警当前申请被其他用户操作。
end;