两个会话中的两个事务在同一项目上运行:
在会话 1 中:
begin tran T1
insert into Invoice with (item,OrderNumber)
select 'ItemA', max(OrderNumber)+1
from Orders
where item='ItemA'
waitfor delay '00:00:05'
commit T1
在会话 2 中:
begin tran T2
insert into Invoice with (item,OrderNumber)
select 'ItemA', max(OrderNumber)+1
from Orders
where item='ItemA'
commit T2
如果像这样,两个相同的行将被插入到表 Orders 中。但我想在任一会话中先完成事务,然后另一个事务可以读取新的 max(OrderNumber),然后插入下一个值。我将保持锁添加到 T1 为:
begin tran T1
insert into Invoice with (item,OrderNumber)
select 'ItemA', max(OrderNumber)+1
from Orders with (holdlock)
where item='ItemA'
waitfor delay '00:00:05'
commit T1
SQl SERVER 是否首先将共享锁分配给 select,因为它首先解析 select 语句,然后将排他锁分配给 insert 语句?在两个会话中,锁究竟是如何相互工作的?感谢您的任何提示