我无法理解 select 在排他事务中的行为方式。请考虑以下场景——</p>
方案 1 步骤 1.1
create table Tmp(x int)
insert into Tmp values(1)
步骤 1.2 - 会话 1
begin tran
set transaction isolation level serializable
select * from Tmp
步骤 1.3 - 会话 2
select * from Tmp
即使第一个会话还没有完成,会话 2 将能够读取 tmp 表。我认为 Tmp 将具有排他锁,并且不应发出共享锁来选择会话 2 中的查询。而且它没有发生。我已确保默认隔离级别为 READ COMMITED。
提前感谢您帮助我理解这种行为。
编辑:为什么我需要在排他锁中选择?
我有一个实际生成顺序值的 SP。所以流量是 -
- 从表中读取最大值并将值存储在变量中
- 更新表设置值=值+1
该 SP 由数千个实例并行执行。如果两个实例同时执行 SP,那么它们将读取相同的值并更新 value+1。虽然我希望每次执行都有顺序值。我认为只有当 select 也是独占锁的一部分时才有可能。