Sql-Server

為什麼 SERIALIZABLE 級別不會為 SQL Server 中的其他會話鎖定表

  • August 12, 2022

我想在我的表中防止刪除、插入、更新和選擇的並發,所以我嘗試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 鎖

引用自:https://dba.stackexchange.com/questions/315544