Sql 由当前事务处理生成 IMHO,虽然两个不同的语句之间可能会执行第三个语句,但在执行单个语句时不可能执行该语句,因此我认为在delete语句中直接应用where子句是安全的,与您给出的第二个不安全的示例不同,使用readcommitted时,单个独立语句不应

Sql 由当前事务处理生成 IMHO,虽然两个不同的语句之间可能会执行第三个语句,但在执行单个语句时不可能执行该语句,因此我认为在delete语句中直接应用where子句是安全的,与您给出的第二个不安全的示例不同,使用readcommitted时,单个独立语句不应,sql,sql-server,transactions,isolation-level,Sql,Sql Server,Transactions,Isolation Level,由当前事务处理生成 IMHO,虽然两个不同的语句之间可能会执行第三个语句,但在执行单个语句时不可能执行该语句,因此我认为在delete语句中直接应用where子句是安全的,与您给出的第二个不安全的示例不同,使用readcommitted时,单个独立语句不应受到其他调用的干扰。你自己的想法似乎很好…嗯,虽然两个不同的语句之间可能会执行第三个语句,但在执行单个语句时不可能执行该语句,所以我认为在delete语句中直接应用where子句是安全的,与您给出的第二个不安全的示例不同,使用readcommi

由当前事务处理生成


IMHO,虽然两个不同的语句之间可能会执行第三个语句,但在执行单个语句时不可能执行该语句,因此我认为在delete语句中直接应用where子句是安全的,与您给出的第二个不安全的示例不同,使用readcommitted时,单个独立语句不应受到其他调用的干扰。你自己的想法似乎很好…嗯,虽然两个不同的语句之间可能会执行第三个语句,但在执行单个语句时不可能执行该语句,所以我认为在delete语句中直接应用where子句是安全的,与您给出的第二个不安全的示例不同,使用readcommitted时,单个独立语句不应受到其他调用的干扰。你自己的想法似乎很好…你对这个声明有任何参考吗?你对这个声明有任何参考吗?我刚刚开始弄清楚锁定提示是如何工作的。如果
HOLDLOCK
类似于
serializable
隔离级别,那么在
repeatable read
事务中运行delete语句不是“更轻”(并保持数据完整性)吗?它更轻,但对于这个目的来说太轻了。我在我的答案中添加了一段。我刚刚开始了解锁定提示是如何工作的。如果
HOLDLOCK
类似于
serializable
隔离级别,那么在
repeatable read
事务中运行delete语句不是“更轻”(并保持数据完整性)吗?它更轻,但对于这个目的来说太轻了。我在回答中加了一段。
delete [dbo].[User] 
    FROM [dbo].[User] AS [U]
    WHERE ( NOT EXISTS (SELECT 
        1 AS [C1]
        FROM [dbo].[Call] AS [C]
        WHERE [U].[Id] = [C].[UserId]
    ))
BEGIN TRANSACTION

@orphanIds = SELECT U.Id
    FROM [dbo].[User] AS [U]
    WHERE ( NOT EXISTS (SELECT 
        1 AS [C1]
        FROM [dbo].[Call] AS [C]
        WHERE [U].[Id] = [C].[UserId]
    ))

DELETE FROM [dbo].[User] 
    WHERE Id in (@orphanIds)

COMMIT
DELETE FROM User
WHERE  Id NOT IN (
    SELECT UserId FROM Call WITH (HOLDLOCK)
)
INSERT INTO Call (Id, UserId)
SELECT 123, Id
FROM   User WITH (HOLDLOCK)
WHERE  Name = 'Johnson'