日期:2014-05-17  浏览次数:20533 次

关于timestamp的概念 我很不理解,请高手来通俗的解释下,谢谢了
看了好多文章和资料,它们大概是这样描述的

A 正在编辑某一篇文章,B 也正在编辑该文章,A 和 B 都不知道对方在编辑这篇文章,双方保存后,都以为已经成功保存,实际上,数据库中只保存了最后提交的记录(先提交的记录被覆盖),这就造成了数据库中的数据与操作者所认为的不一样。
因此要用到timestamp,用了timestampe后
假设某条记录同时被两个人A和B读取并且正在修改。A先修改完成然后保存了,然后B再保存的时候,会由于时间戳不一致(因为A之前先保存修改了时间戳)导致B并没有更新成功,  这样就防止了丢失更新的现象。 


第一点不理解:
各位我的不解就在上面最后一句话
"导致B并没有更新成功,  这样就防止了丢失更新的现象。"
妈的,我很矛盾,B没更新成功,还能防止丢失更新!他自己不是已经丢失更新了,

第二点不理解:
我想,似乎是不管加不加时间截,两个同时更新的A和B,总是有 一个会失败,那我们还要时间截有毛用.

请高手针对那两点不理解 进行回答,谢谢


------解决方案--------------------
第一点不理解:
各位我的不解就在上面最后一句话
"导致B并没有更新成功,  这样就防止了丢失更新的现象。"
妈的,我很矛盾,B没更新成功,还能防止丢失更新!他自己不是已经丢失更新了,
回答:如果B更新成功了,那么A就编程“丢失更新”了,而因为A是首先更新的,按照常理来说,应当保护这个更新的结果。所以牺牲B,这里的防止丢失应该是说防止A的丢失
第二点不理解:
我想,似乎是不管加不加时间截,两个同时更新的A和B,总是有 一个会失败,那我们还要时间截有毛用.
时间戳在这里并不是人为加上,我觉得是说sqlserver使用行版本隔离级别来保证,而这个时间戳是在tempdb里面的
------解决方案--------------------
个人感觉:
第一点不理解:
各位我的不解就在上面最后一句话
"导致B并没有更新成功,  这样就防止了丢失更新的现象。"
妈的,我很矛盾,B没更新成功,还能防止丢失更新!他自己不是已经丢失更新了,

这应该是看业务需求,有的情况下,更新的结果不需要太严格,如更新帖子的阅读人数,多几个少几个没多大关系;但有的情况下,更新的结果就需要很严格,如更新库存,通常的规则就是先到先得,谁先Update了,就承认谁的。例如,库存中有100个,两个人都要领100个,开始时,两个人都查有100个库存,都进行Update,如果没有timestamp,两个人都领了100个,但库存是不够的;而用了timestamp,第一个人是可以领的,第二个人再领时,timestamp变了,就需要重新查询库存,这时就发现库存已经没有了,就不能领了。当然,这种情况可以通过其他方式解决而不用timestamp。

第二点不理解:
我想,似乎是不管加不加时间截,两个同时更新的A和B,总是有一个会失败,那我们还要时间截有毛用.
这要看程序的写法,有些写法,在同时更新时,会失败一个;有的写法,同时更新时,哪个都不会失败,而且对于数据库来说,不失败是默认的做法。