2013-04-15 132 views
2

建议的副本不回答标题中的问题。正确执行2条SQL命令而不执行其他命令的方法

我想执行两个MSSQL命令,但没有任何其他“用户”(我不知道什么是正确的术语)在它们之间执行命令。

搜索,我发现两种方法看起来他们会做到这一点,但我不确定他们:

  1. 使用TABLOCK。 - 但我看到它被认为是不好的做法。

  2. 使用交易 - 但我所能找到的是它将是原子的,并且不一定会锁定其他操作。

什么方法是正确的方法?

更多信息:只有我的程序要访问数据库,但也可能是从它的几个实例,我不介意短暂的等待 - 如果一个实例将不得不排队等待一两秒钟- 没关系。

编辑:我试图插入一行,并得到它的身份。 (看起来并不像我期望的那样直截了当。)

+1

你能解释为什么它如此重要以至于不会执行其他查询? – Pako

+0

这两个命令是什么? – mbeckish

+0

事务不会锁定正在使用的表以防止更改已使用的数据吗? – MAV

回答

3

您需要使用交易的IsolationLevel。这将阻止其他用户在事务持续时间内读取或修改查询所使用的行,而不会完全锁定表。

+0

谢谢。我想要锁定整个桌子。那可能吗? – ispiro

+0

@ispiro你为什么要锁定整个表格? –

+0

因此,没有人会先看到这些数据,然后再写入新数据。 – ispiro

11

要插入一行并获取其身份,您不需要阻止所有其他命令。就在组合使用事务与SCOPE_IDENTITY

BEGIN TRAN; 

INSERT INTO MyTable (MyColumn) 
VALUES ('MyValue'); 

SELECT SCOPE_IDENTITY(); 

COMMIT TRAN; 

更多SCOPE_IDENTITYMSDN

+0

我错过了为插入值获取ID的位,这是为特定情况提供的方式。 –

+0

谢谢。作为阅读您的答案的结果,我搜索了并发现MSSQL中可能存在一个错误,导致该错误不可靠。 (请参阅:http://support.microsoft.com/kb/2019779)。或者,这是一个古老的,但已被修复? – ispiro

+0

根据该链接,“此问题的修补程序是在累积更新5中为SQL Server 2008 R2 Service Pack 1首次发布的。” –

1

您不能阻止命令在两个其他命令之间执行。你所能做的就是防止数据被修改,直到你完成自己的修改。这是通过使用各自隔离级别的事务完成的。