مجت*_*یان 2 sql-server-2008 sql-server query concurrency sql-server-2008-r2
我想防止表中的删除、插入、更新和选择并发,因此我尝试SERIALIZABLE
在转换之前使用该表,但这并没有为其他进程锁定该表!如何修复它?
我尝试过什么:
1-创建表_1
--Create Sample Table
CREATE TABLE [dbo].[Table_1](
[Number] [bigint] NOT NULL,
[Price] [bigint] NULL,
CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED
(
[Number] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
INSERT [dbo].[Table_1] ([Number], [Price]) VALUES (1, 1000)
GO
INSERT [dbo].[Table_1] ([Number], [Price]) VALUES (2, 3000)
GO
INSERT [dbo].[Table_1] ([Number], [Price]) VALUES (3, 8000)
GO
Run Code Online (Sandbox Code Playgroud)
2- 查询有延迟的会话一:
--SESSION 1
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
WAITFOR DELAY '00:00:10.000'
UPDATE Table_1 SET Price = 6000 WHERE NUMBER = 1
SELECT * FROM Table_1
COMMIT TRANSACTION;
Run Code Online (Sandbox Code Playgroud)
3-查询会话二,该查询大多数等待会话一直到结束过程,但事实并非如此!:
--SESSION 2
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
SELECT * FROM Table_1
COMMIT TRANSACTION;
Run Code Online (Sandbox Code Playgroud)
你的拖延是在错误的地方。
在进行任何更改之前,您在事务 1 中等待十秒钟。
事务 2 没有理由在事务 2 进行任何更改之前等待。
把延迟放在更新之后,你就会看到阻塞。
可序列化隔离级别保证的结果与事务按某种顺序顺序运行的结果相同。它并不要求交易实际上以这种方式运行。
如果要阻止所有并发,请采用独占表锁。有关详细信息,请参阅相关的 Q & A请求表上的 Sch-M 锁。