我已经读完的文章(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上只有一个主键。
包含索引的表的定义是什么? –