2010-06-07 75 views
2

我想执行更新,然后选择结果。我不希望任何东西能够更新我要更新的行,直到选择发生之后。我将如何做到这一点?SQL Server 2005和SELECT和UPDATE锁定

我的目标是增加一行的值并返回增加的值。到目前为止,我发现我最终遇到了一个问题,即更新(增加),然后在选择似乎返回相同数字的同一时间发生两个查询的情况下进行选择。所以我猜测,更新>更新>选择>选择正在发生。

我错过了将其标记为SQL Server 2005.我实际上使用Server 2000.所以输出子句不起作用(不在该版本中)。

BEGIN TRANSACTION 
UPDATE Table SET Last=(Last+1) WHERE ID=someid; 
SELECT * FROM Table WHERE ID=someid; 
COMMIT TRANSACTION 
+0

你绝对没有在选择获取更新中使用的值的select [select> update> select'? – 2010-06-08 17:39:37

+0

我正在添加调试以查找确切值,我知道它们是相同的。 – aepheus 2010-06-08 17:42:53

+0

你能发布代码吗? – 2010-06-08 17:43:46

回答

3
BEGIN TRAN 
UPDATE ... 
SELECT... 
COMMIT 

甚至应该在提交读的默认事务隔离级别做到这一点。

您也可以使用OUTPUT子句在更新后直接返回该行。这样的例子:

UPDATE <YourTable> 
    SET ... 
OUTPUT INSERTED.* 
WHERE ... 
+0

谢谢,开始/提交正是我一直在寻找。 – aepheus 2010-06-07 22:39:16

+0

为了完整起见,我应该提到,如果where子句不保证是唯一的,并且您希望确保您的选择不会返回更新后插入的任何附加行,这些行与您需要的where子句相匹配使用SERIALIZABLE隔离级别。 – 2010-06-07 23:03:55

+0

这似乎并没有像我预料的那样工作。今天上午测试似乎表明,更新和选择仍然存在问题。看起来像两个“更新然后选择”调用可以进来,发生这样的事情:更新>更新>选择>选择。如果两个选项的结果都是相同的值,那么它们应该具有不同的值。注意:这一切都在同一行。 – aepheus 2010-06-08 17:10:43