gpt4 book ai didi

sql-server - 如何使它成为示例 SQL Atomic?

转载 作者:行者123 更新时间:2023-12-04 02:53:55 26 4
gpt4 key购买 nike

我有一个存储过程,

ALTER PROCEDURE [dbo].[InsertDealGallery] 
(
@ImageID INT,
@DealID INT
)
AS

DECLARE @MaxOrder INT;
SELECT @MaxOrder = MAX([Order]) + 1 FROM DealGallery WHERE DealID = @DealID

IF (@MaxOrder IS NULL)
BEGIN
SET @MaxOrder = 1;
END



INSERT INTO [DealGallery]
([ImageID]
,[DealID]
,[Order])
VALUES
(@ImageID
,@DealID
,@MaxOrder)

但我担心这不是原子的,因为同时 MaxOrder 可能在并发线程中保持不变。那么如何使这个原子化?

最佳答案

Transactions 是获取原子行为的特征。你知道 ACID 中的 a 代表 Atomic。但是你选择了一个非常糟糕的设计,聚合函数可以锁定所有行,性能变得很差。

已编辑

你应该转向 identitat 数据类型。还存在另一种技术,如计数器表,但简单的方法是标识。

要将代码包含在事务中,您应该包含“开始事务”和“提交”语句。

已编辑 2

这种方法,每个Deal都有一个计数器,将避免锁定所有DealGallery的行,只锁定DealGalleryCounter行。

CREATE TABLE DealGalleryCounter 
(DealID INT not null primary key,
order int default 0
); -- Or add column to an existing deal table.

ALTER PROCEDURE [dbo].[InsertDealGallery]
(
@ImageID INT,
@DealID INT
)
AS BEGIN
DECLARE @order int

begin transaction
set transaction isolation level serializable
-- repeatable read is enough --

select @order = order + 1
from DealGalleryCounter
where @DealID = DealID

if @order is null
insert into DealGalleryCounter (DealID) values (@DealID)

INSERT INTO dbo.DealGallery (ImageID, DealID, [Order])
VALUES ( @ImageID, @DealID, @order );

update DealGallery
set DealGalleryCounter = @order
where @DealID = DealID;

commit; --or check for errors and rollback
END

关于sql-server - 如何使它成为示例 SQL Atomic?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17059471/

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