Sql-Server
為什麼 SERIALIZABLE 級別不會為 SQL Server 中的其他會話鎖定表
我想在我的表中防止刪除、插入、更新和選擇的並發,所以我嘗試
SERIALIZABLE
在事務之前使用表,但這並沒有為其他程序鎖定表!如何解決?我嘗試了什麼:
1- 創建 Table_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
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;
3-查詢會話二,這個查詢最多等待會話一直到結束程序,但事實並非如此!:
--SESSION 2 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; BEGIN TRANSACTION; SELECT * FROM Table_1 COMMIT TRANSACTION;
你的延遲是在錯誤的地方。
在進行任何更改之前,您在事務 1 中等待十秒鐘。
事務 2 沒有理由在事務 2 進行任何更改之前等待。
把延遲放在更新後,你會看到阻塞。
可序列化的隔離級別保證結果與事務以某種順序按順序執行*一樣。*它不要求事務實際上以這種方式執行。
如果要防止所有並發,請使用排他表鎖。有關詳細資訊,請參閱表上的相關問答請求 Sch-M 鎖。