我刚遇到一个我正在针对SQL Server 2014运行的查询的奇怪行为。
SELECT *
FROM ExampleTable
WHERE ExampleTimestamp < '22.06.2016 15:35:00'
现在奇怪的是它会两次返回一行,这是我预计不会发生的。
从数据中我可以看到,每次出现的两列重复行都是不同的(其中一列是ExampleTimestamp
列)。
数据行很可能是由另一个线程更改的,但是数据行在一个DataTable
中返回两次是否正常?
如果在查询期间更改了一行,如何阻止两次获取行?
答案 0 :(得分:2)
我可能错了,但根据我最新的知识,对数据行的更新是插入一个新行并删除旧行。您可能正好在两者之间放置查询。
在事务中包装对数据库的任何写访问权限时,可以解决此问题。这样,您将在提交事务之前或之后获得状态,但从不在它们之间获得未定义状态。
我希望这会有所帮助。
Saxxon
答案 1 :(得分:1)
你是说有一行符合标准,但你在结果中得到2?
也许您需要将TRANSACTION ISOLATION LEVEL设置为与您拥有的不同的东西。
答案 2 :(得分:1)
您需要正确设置transaction isolation level。 E.g:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
要非常小心,因为这些级别对性能有重大影响。在同样的情况下,速度比一致性更重要,有时反过来。
您可能需要在transaction中运行查询:
BEGIN TRANSACTION 'tran';
SELECT *
FROM ExampleTable
WHERE ExampleTimestamp < '22.06.2016 15:35:00'
COMMIT TRANSACTION 'tran';
GO
更新:REPEATABLE READ
解决了这个问题,READ COMMITTED
没有。
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
根据隔离级别定义,REPEATABLE READ
是阻止east restrictive isolation level现象的l Non Repeatable Read。