我有一个简单的问题...如果我运行以下命令:
BEGIN TRANSACTION
<commands...>
DELETE FROM <table>
COMMIT TRANSACTION
当上述事务正在运行时,在表上执行插入操作。请问删除:
希望有人可以提供帮助。
答案 0 :(得分:3)
您需要深入了解“锁定和事务隔离级别”主题。看看这个例子,这可能比上一个答案更常见。此处未阻止INSERT,因为DELETE只是锁定了一组DELETE操作的键。
无论如何,在DELETE操作开始之前,如果此事务中的其他查询没有在此表上持有锁,则SQL Server没有理由阻止INSERT操作从其他事务开始。
CREATE TABLE t (Id int PRIMARY KEY)
GO
INSERT INTO t VALUES(1)
GO
BEGIN TRAN
DELETE FROM t
-- separate window
INSERT INTO t VALUES(2)
答案 1 :(得分:2)
我假设您正在一个SPID中运行代码,插件将在其他SPID上运行,隔离级别是SQL SERVER中的默认级别 - READ COMMITTED。
很快,答案是否定的,因为INSERT将等待DELETE结束。像这样测试:
1)设置:
-- drop table dbo.Test
CREATE TABLE dbo.Test
(
Id INT NOT NULL,
Value NVARCHAR(4000)
)
GO
INSERT INTO Test (Id, Value)
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)), text
from sys.messages
GO
2)在查询窗口1中
BEGIN TRANSACTION
DELETE FROM dbo.Test where ID > 100000
3)在查询窗口2中
INSERT INTO Test (Id, Value)
SELECT 100000000 + ROW_NUMBER() OVER (ORDER BY (SELECT 1)), text
from sys.messages
sp_who2 active
显示第一个查询阻止了第二个查询(SPID),因此查询等待获取锁定
3)在查询窗口1中
COMMIT -- query 1 will finish
4)第二次查询将完成
因此,INSERT必须等到DELETE结束。
答案 2 :(得分:0)