我已經讀完的文章(https://www.simple-talk.com/sql/t-sql-programming/questions-about-t-sql-transaction-isolation-levels-you-were-too-shy-to-ask/)混亂,我根據有一個問題:SQL Server中的序列化隔離級別
「SERIALIZABLE:一個在當前事務中不能讀取由未另一個事務修改數據查詢沒有其他事務可以修改當前事務正在讀取的數據直到它完成,並且沒有其他事務可以插入與當前事務中的搜索條件匹配的新行直到它完成爲止,結果是,Serializable隔離級別阻止髒讀,不可重複讀取和幻像讀取,但與其他隔離級別相比,它對性能影響最大。「
我很困惑插入新的行不滿足搜索條件從1會話/查詢。下面的例子:
讓我們假設我有表中單獨的選項卡
EmpID FirstName
1 john
2 new employee
3 A new employee
和查詢:
--session 1----------------------------------
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
SELECT FirstName FROM EmployeeInfo
WHERE FirstName like 'new empl%'
WAITFOR DELAY '00:00:10'
SELECT FirstName FROM EmployeeInfo
WHERE FirstName like 'new empl%'
ROLLBACK TRANSACTION;
---------session 2---------------------------
begin transaction;
UPDATE EmployeeInfo
SET FirstName = 'frank'
WHERE EmpID = 1;
commit transaction;
-----session 3----
insert into EmployeeInfo values('A new employe 2')
我執行後,其他查詢之一:會話1,會話2,會話3 我期望會話1不會停止執行會話2和會話3,因爲來自此會話的更新和插入不滿足第一個查詢中使用的搜索條件。但是,在結果中,我可以看到會話1必須在會話2和會話3執行之前完成(回滾)。
然而,雖然我使用其他搜索條件在會話1象下面這樣:
--session 1
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
SELECT EmpID, FirstName FROM EmployeeInfo
WHERE EmpID = 2
WAITFOR DELAY '00:00:10'
SELECT FirstName FROM EmployeeInfo
ROLLBACK TRANSACTION;
然後,會話2和會話3獨立會話的完成1. 爲什麼呢?爲什麼像條件塊插入時,「=」不?
編輯: 1.在EmpID上只有一個主鍵。
包含索引的表的定義是什麼? –