在Web系统中,怎样避免几个人编辑同一段数据所造成的冲突?
因为现在应用的规模大了,造成数据有很大的程度被多人同时操作修改,请教下,如何避免解决这种数据使用冲突的问题呢?
加锁好像很麻烦,WEB的退出方式太多,意外太多,无法保证能及时解锁。
请教各位高手,有什么方法、思路或者实际经验可以帮忙指导下!
多谢多谢!
(分不够了,等有分了会补上)
Web
数据共用
操作冲突
------解决方案--------------------可应用版本或时间戳,如A、B、C同时读取某条记录,但都不一定要修改或都有可能修改,这时就可用版本或时间戳了,若A先修改(在数据库中同一条记录不可能被多条语句同时修改的,看以并发,实际是有顺序的),则版本版本或时间戳马上会变的,这时若B修改,每个修改都需要有这样的条件 Where 主键= 主键值 AND 版本 = 之前读取的版本,若返回影响行数为0,则表示已被别人修改过了(则可以客户端相应的提示,如记录已被其他人修改,再刷新再试等等这类)。
------解决方案--------------------在 Sql Server 数据库有一种数据类型为 timestamp (时间戳),只要你对本条记录的任何一个字段进行修改,该值都会发生变化,具体使用请查相关资料,我就不多说了,你也可以自己搞一个版本,如建一个触发器等等
------解决方案--------------------在B提交时才发现A已经提交了,造成他的提交失败并且他好大一番的编辑劳动也随之作废,这是非常不友好的。
AJAX是干嘛的?不就是为了完成即时通讯通知吗?A的操作可以通过AJAX反映到服务器,如果显示出A已经超过最大允许时间都没有回馈,就可以认为A已经退出(当然,在那之前应该在A的前台进行提示),收回编辑权,或者将编辑的内容定时自动提交(根据业务要求的策略进行安排)。
这个AJAX程序可以扩展得很丰富,完成多种功能。具体就自己琢磨吧。
------解决方案--------------------悲观并发的问题。
在读取字段内容到网页后。
在随后的update语句中像这样
update table set fieldName='新值' where id=1 and fieldName='旧值'
这样仅在fieldName中的现有值与加载到页面时的值一致时,才能肯定在此期间此记录没有被修改过,才会进行更新。