SELECT返回DataRow两次

时间:2016-06-22 13:57:33

标签: sql-server sql-server-2014

我刚遇到一个我正在针对SQL Server 2014运行的查询的奇怪行为。

SELECT * 
FROM ExampleTable 
WHERE ExampleTimestamp < '22.06.2016 15:35:00'

现在奇怪的是它会两次返回一行,这是我预计不会发生的。

从数据中我可以看到,每次出现的两列重复行都是不同的(其中一列是ExampleTimestamp列)。

数据行很可能是由另一个线程更改的,但是数据行在一个DataTable中返回两次是否正常?

如果在查询期间更改了一行,如何阻止两次获取行?

3 个答案:

答案 0 :(得分:2)

我可能错了,但根据我最新的知识,对数据行的更新是插入一个新行并删除旧行。您可能正好在两者之间放置查询。

在事务中包装对数据库的任何写访问权限时,可以解决此问题。这样,您将在提交事务之前或之后获得状态,但从不在它们之间获得未定义状态。

我希望这会有所帮助。

Saxxon

答案 1 :(得分:1)

你是说有一行符合标准,但你在结果中得到2?

也许您需要将TRANSACTION ISOLATION LEVEL设置为与您拥有的不同的东西。

https://msdn.microsoft.com/en-GB/library/ms173763.aspx

答案 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

相关问题