gpt4 book ai didi

sql - 这个存储过程是线程安全的吗? (或者 SQL Server 上的任何等效项)

转载 作者:行者123 更新时间:2023-12-02 03:41:35 30 4
gpt4 key购买 nike

在其他人的帮助下,今天早上我已经敲定了几个表和存储过程,因为我距离数据库程序员还很远。

有人介意看看这个并告诉我它是否是线程安全的吗?我想这可能不是 DBA/DB 开发人员使用的术语,但我希望您能理解:基本上,如果这个 sp 正在执行,而另一个 sp 同时出现,会发生什么?一个可以干扰另一个吗?这甚至是 SQL/SP 中的问题吗?

CREATE PROCEDURE [dbo].[usp_NewTicketNumber]
@ticketNumber int OUTPUT
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO [TEST_Db42].[dbo].[TicketNumber]
([CreatedDateTime], [CreatedBy])
VALUES
(GETDATE(), SUSER_SNAME())
SELECT @ticketNumber = IDENT_CURRENT('[dbo].[TicketNumber]');
RETURN 0;
END

最佳答案

您可能不想使用 IDENT_CURRENT - 这会返回在任何 session 和任何范围内相关表上生成的最新标识。如果其他人在错误的时间插入,您将获得他们的 ID!

如果您想获取刚刚执行的插入生成的标识,那么最好使用 OUTPUT子句来检索它。过去通常使用 SCOPE_IDENTITY() 来实现此目的,但在并行执行计划下存在问题。

线程安全的主要 SQL 等效项是执行多个语句导致意外或不良行为。我能想到的这种行为的两种主要类型是锁定(特别是死锁)和并发问题。

当一条语句阻止其他语句访问它正在使用的行时,就会出现锁定问题。这可能会影响性能,在最坏的情况下,两条语句进行无法协调的更改,并发生死锁,导致一条语句终止。

但是,像您这样的简单插入不应导致锁定,除非涉及其他内容(例如数据库事务)。

并发问题(描述得非常糟糕)是由对数据库记录的一组更改覆盖对同一记录的其他更改引起的。同样,插入记录时这不应该成为问题。

关于sql - 这个存储过程是线程安全的吗? (或者 SQL Server 上的任何等效项),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1483383/

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