SQL Server插入锁定与并发事务

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

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

假设SQL Server版本是2008 R2,如果这有所帮助。


我没有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那么第二个查询将完成。 您可以提交或回滚第一个查询,而第二个查询的结果将不受影响。


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

为前。

select * form tablename with(nolock)
链接地址: http://www.djcxy.com/p/32881.html

上一篇: SQL Server insert locking with concurrent transactions

下一篇: Is xlock,rowlock,holdlock correct?