时间戳

来源:互联网 发布:linux输出重定向命令 编辑:程序博客网 时间:2024/05/08 12:10

    利用timestamp(时间戳)避免更新冲突  

    2009-01-05 23:37:53|  分类:ASP.NET/C# |  标签:|字号 订阅

    SQL Server 里有数据类型 timestamp,这里我们将利用 timestamp 来避免更新冲突。

      比如一个内容管理系统,A 正在编辑某一篇文章,B 也正在编辑该文章,A 和 B 都不知道对方在编辑这篇文章,双方保存后,都以为已经成功保存,实际上,数据库中只保存了最后提交的记录(先提交的记录被覆盖),这就造成了数据库中的数据与操作者所认为的不一样。

      要避免这种更新冲突,一种方法可以采用模拟锁的形式,一个人在编辑另一个人就不允许编辑,但比较麻烦,由于这种更新冲突并非常见,投入较大精力在这上面,不值。这里使用 timestamp 轻松实现避免更新冲突。

      每一个数据库都有一个计数器,这个计数器记录着数据行的插入、更新行为。如果我们为一个表中增加 timestamp 列,那么,该列将记录每一个数据行的计数器值。

      假如数据库中当前的计数器是 20(实际中不是数字类型,为了方便解释,这里用数字类型):那么在表 A 中插入一条记录后,插入行的 timestamp 为 21;然后更新表 B 的一条记录后,更新行的 timestamp 为 22;现在再更新刚才插入的行,此时其 timestamp 为 23。

      可以看出,每个行都有一个 timestamp,并且是在数据库的所有表中唯一的,当更新行时,被更新的行的 timestamp 会加 1。注意删除不影响计数器。

    timestamp 作用

      timestamp 就是设计来避免更新冲突的,您可以参见利用 timestamp 避免更新冲突这篇文章。当然还有其它一些作用,比如 SQL Server 全文索引时用以增量填充。

    timestamp 应用

      我们只需要添加一个为 timestamp 类型的列就可以了,它会自动记下当前计数器的值。一个表只能有一个 timestamp 列,并且不能将该列作为主键。不可为空的 timestamp 列在语义上等价于 binary(8) 列;可为空的 timestamp 列在语义上等价于 varbinary(8) 列。

    timestamp 会重复吗?

    可能会,在使用 select into 时。

    如何查看数据库中当前的 timestamp?

    请使用 @@DBTS,比如在查询分析器中用:print @@DBTS。

    增、改没有 timestamp 列的表数据时,@@DBTS 会变吗?

    不会。

    原创粉丝点击