我说的“策略有问题”不是指怎么锁定的问题,而是该不该“锁定”的问题。你把注意力放在前者我觉得是治标,考虑后者才是治本。当然,也许是我猜错了你的需求,呵呵。
太晚了,我没精力过多描述对你需求的猜测,大致说说我的建议:
1、你现在的业务逻辑:
“每一条记录都加USER_ID和DATETIME数据项,当一个人进入编辑画面时,首先检查USER_ID是否为空,如果不为空,表明该记录被别人正编辑,不能进入;为空,则允许进入编辑画面,并且更新USER_ID为当前用户,DATETIME为当前时间。退出编辑画面时,则清空USER_ID和 DATETIME”;
2、我建议的业务逻辑:
1) 每一条记录都加VERSION_LOG数据项,内容为(USER_ID||DATETIME||更改的数据id);这个更改的数据id含义下面会提及;
2) 可同时编辑。当几个人进入编辑画面时,读出原数据以及VERSION_LOG送到客户端。于是出现“各干各的”状况;
3) 总有一个人先完成编辑,需要将数据送到服务端进行数据更新。关键点在此:提交前,先AJAX(参数为编辑前的VERSION_LOG)到服务器,检查一下VERSION_LOG,看看USER_ID||DATETIME有没有更新。如果没有,没的说,服务端返回OK给该用户的客户端,那么,本次编辑的数据由这个用户提交服务器,写库。写库时,最好先不要更新数据,而是将数据另外存入一个临时表,然后将临时表的该数据的id放入VERSION_LOG,这样就可以用新的USER_ID||DATETIME||更改的数据id 来更新VERSION_LOG;
4) 第二个人完成编辑后,同样先AJAX(参数为编辑前的VERSION_LOG)请求服务器的VERSION_LOG,发现VERSION_LOG变了,则以更改的数据id取得前个用户的编辑数据返回给第二个用户的客户端显示出来,让他自己斟酌怎么处理,给出几个选择:
a)前面的合理,放弃自己的;
b)坚持我的,还要上传;
c)覆盖前个用户的更改(此人要有高权限);
a没的说;b、c需要你们自己去论证如何处理
5)以此类推,第三个人AJAX,把前两个人的编辑后的数据返回给他,同4)....
6)如果出现几个人各持己见,那就由他们的大佬最后定夺。。。。
========================
顺便说个小例子,不知道是不是对你有启发:
一个文本文件,你同时用记事本和ultraEdit打开,当你先在基本里更改并保存后,转到ultraEdit后,会跳出提示。。。。虽然和你的需求不太搭,但可参考。强调一下,上面说的条理也不清楚,仅仅是个建议。