2014-04-23 164 views
0

假设我有一个事务中包含一个事务,该事务使用读取未提交隔离级别并将插入语句插入到具有标识列后跟一系列选择语句的表A中。 insert语句不要求TABLOCKX。SQL Server插入锁与并发事务

如果多个调用同时发出到这个过程,那么由于事务中的insert语句,这些调用会被序列化,还是会被允许同时执行呢?我知道这是否是一个更新语句,为每个调用改变完全相同的行,以便序列化,但是如何使用标识列来插入语句?这是否会导致事务在事务持续期间对表进行独占锁定?

假设SQL服务器版本是2008 R2,如果这有所作为。

回答

0

我没有SQL 2008方便,但在SQL 2012中,它将允许任何事务先完成(我认为它在2008年是相同的)。

在SSMS中测试很简单。首先,在数据库中创建一个表:

CREATE TABLE [dbo].[Test1](
    [ID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    [Value] [varchar](500) NULL, 
) ON [PRIMARY] 

然后在2个不同的查询窗口中运行以下查询:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
begin tran 

    insert into test1 values (1) 
    select * from test1 

注:查询不回滚或提交。

如果你运行没有第一行的查询,那么第一个查询将运行,然后等待第二个将是顺序的。如果您将事务隔离级别设置为Read Uncommitted,那么第二个查询将完成。您可以提交或回滚第一个查询,而第二个查询的结果将不受影响。

+0

有意义,并尝试它并收到预期的行为。我担心的不是选择阻塞,而是第二次插入阻塞,这是因为来自第一次插入的未提交写入影响了同一个表上的同一列。 – GameSalutes

0

使用WITH(NOLOCK)与选择查询。即使表格或行处于更新状态,也会给出输出。它会输出最后提交的数据。

for ex。

select * form tablename with(nolock)