gpt4 book ai didi

sql-server - 是否必须在每个 session 中指定 tabblockx?

转载 作者:行者123 更新时间:2023-12-03 11:15:14 26 4
gpt4 key购买 nike

我分别在两个 session 中有两个测试事务。假设这两个事务将同时运行。我试图做的是让一笔交易在另一笔交易完成后正确插入发票号码。没有重复。我做了如下。但是如果我在 session 2 中使用 (tablockx) 删除,它们将不再起作用。我在网上查过,但没有答案。有人会帮忙吗? Serializable 将不起作用,因为两个 SELECT 想在这里互斥。谢谢。

在 session 1 中:

begin transaction 
declare @i int
select @i=MAX(InvNumber) from Invoice
with(tablockx)
where LocName='A'
waitfor delay '00:00:10'
set @i=@i+1
insert into Invoice values('A',@i);
commit

在 session 2 中:
begin transaction 
declare @i int
select @i=MAX(InvNumber) from Invoice
with(tablockx)
where LocName='A'
set @i=@i+1
insert into Invoice values('A',@i);
commit

最佳答案

这会起作用,但也会完全阻止对表的所有其他访问。

如果您这样做 WITH(UPDLOCK, HOLDLOCK),您可能会以更低的粒度(比表)和模式(比独占)锁定.
HOLDLOCK提供可序列化的语义,因此可以只锁定索引顶部的范围(如果您在 LocName,InvNumber 上有一个)。
UPDLOCK确保两个并发事务不能同时持有相同的锁,但与独占不同的是,它不会阻塞其他(普通)读取器不使用提示。

BEGIN TRANSACTION

DECLARE @i INT

SELECT @i = MAX(InvNumber)
FROM Invoice WITH(UPDLOCK, HOLDLOCK)
WHERE LocName = 'A'

WAITFOR delay '00:00:10'

SET @i=@i + 1

INSERT INTO Invoice
VALUES ('A',
@i);

COMMIT

或者,您可以使用 sp_getapplock 序列化对该代码的访问。

关于sql-server - 是否必须在每个 session 中指定 tabblockx?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18476916/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com