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