阻止用户互相覆盖

mat*_*lin 4 c# database overwrite

我想在更新记录时阻止两个用户意外地覆盖彼此.也就是说两个用户加载一个带有记录A的页面.用户1将记录更新为AB,用户2将其更新为AC.

我不只是想让最后一个命中数据库来覆盖.我需要一种机制来说明记录已经更新,因此你的记录无法保存.

现在我的两个想法是给记录加盖时间戳并检查.如果不匹配则不允许更新.第二种方法是每次执行更新时GUID记录,检查GUID以及它是否不匹配不更新.

这些方法中的任何一种都是有效的,如果是的话,这是最好的.如果没有,你有什么建议.这是在C#中,如果它有所作为

谢谢

Jon*_*eet 11

您提到的两种方法实际上是等效的 - 无论哪种方式,您都可以有效地获得"结账时记录"的唯一标识符.我没有对哪个更好任何特定的观点,虽然时间戳显然给你的数据什么时候记录的额外好处有效的.

另一种方法是记住以前的值是什么,只有在匹配时才允许更新 - 如果用户A开始编辑记录,那么用户B进入并更改某些内容,然后将其更改回来,用户A的编辑仍然有效.

这些技术的术语是乐观锁定(或乐观并发控制).


小智 5

实际上有第三种方法.要执行此更新,请发出此表单的更新声明:

UPDATE table SET update_field = new_value
WHERE db_pk = my_pk       // assume primary key immutable
AND update_field = original_field_value
Run Code Online (Sandbox Code Playgroud)

其中original_field_value是尝试更新之前字段的值.如果其他人已修改此更新将失败update_field,除非他们已将其更改为您拥有的相同值.