我们有一个sybase ASE 15 DB并且上周发生了一些奇怪的事情,它看起来像插入后可能错过了新插入的行上的选择
我们的表使用开始/结束时间戳进行里程碑化;一个例子是
id number,
name varchar(32),
start timestamp,
end timestamp;
"更新"将是现有结束的更新;和新记录的插入;例如
id name start end
1 alice 2010-01-01 00:00:00 3000-01-01 00:00:00
更新将成为
id name start end
1 alice 2010-01-01 00:00:00 2010-01-01 08:00:00
1 bob 2010-01-01 08:00:00 3000-01-01 00:00:00
并且更新和插入都在同一个事务中完成
现在使用行锁定和索引(id,start,end),当选择使用隔离级别1时,使用select query:
select * from table where id=1 and start<=getdate() and end>getdate()
理想情况下,在更新期间运行select时,它应该阻塞直到提交并返回最新的行。
但是在我们的例子中,我们看到了阻塞,但没有返回任何行!
这对我来说意味着当select运行时,它会看到更新而不是insert;那可能吗?
是否可能以某种方式提交,插入新行但索引未更新因此select没有看到新行?
谢谢
答案 0 :(得分:0)
如果这是Sybase ASE,那么您必须选择与&#39; timestamp&#39;不同的数据类型。 - 这是ASE中的一种特殊数据类型,与实际日期/时间无关。使用&#39; bigdatetime&#39;或者&#39; datetime&#39;代替。