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'