我最近在工作中发现 Sybase 数据库中的一个表使用“时间戳”类型的列。如果我使用这种神秘的时间戳数据类型创建一个表,如下所示
create table dropme (
foo timestamp,
roo int null
)
insert into dropme (roo) values(123)
insert into dropme (roo) values(122)
insert into dropme (roo) values(121)
select * from dropme
go
我从“select * from dropme”中得到以下信息:
foo roo
-------------------- -----------
0x000100000e1ce4ea 123
0x000100000e1ce4ed 122
0x000100000e1ce509 121
0x000100000e1ce4ea 对我来说看起来不太有时间戳。另外,我看到“sp_help timestamp”的输出:
Type_name Storage_type Length Prec Scale Nulls Default_name Rule_name Access_Rule_name Identity
--------- ------------ ------ ---- ----- ----- ------------ --------- ---------------- ----------
timestamp varbinary 8 NULL NULL 1 NULL NULL NULL NULL
我的问题如下
- 时间戳到底是什么?
- 它与时间或日期有任何关系吗?
- 我可以将其转换为日期时间吗?
- 如果它不是时间或日期,你用它做什么?
时间戳到底是什么?
时间戳数据类型定义为
varbinary(8) null
它与时间或日期有任何关系吗?
不,这个名字选得不好。
我可以将其转换为日期时间吗?
No.
如果它不是时间或日期,你用它做什么?
每次插入或更新带有时间戳列的行时,时间戳列都会自动更新。请注意,实际上有两种时间戳。TIMESTAMP
and CURRENT TIMESTAMP
。不同之处在于CURRENT TIMESTAMP
仅在插入时设置。
赛贝斯文档 http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0.sqlug/html/sqlug/sqlug215.htm停在那里让我想知道为什么有人会使用数据类型时间戳。庆幸的是,我找到了一些other http://dba.fyicenter.com/Interview-Questions/SYBASE/The_timestamp_datatype_in_Sybase_.html 讨论 http://en.wikipedia.org/wiki/Optimistic_concurrency_control并推导了其在实现乐观并发控制时的使用。
并发控制是一种确保多个事务可以同时/大约同时运行并且仍然产生正确数据的方法。乐观并发控制是一种并发控制方法,假设多个事务可以在不互相干扰的情况下完成。即不需要锁定。维基百科描述了以下算法:
- 交易开始时记录日期/时间标记
- 读取/更新数据
- 检查是否有其他事务修改了数据
- 提交或回滚
Sybase 的时间戳数据类型可以用于该算法的步骤 1 和 3,而不是使用日期/时间。但在我看来,它并没有比使用日期时间数据类型节省很多工作。我想它可能会有更好的表现。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)