确保只有一个SQL更新进行更改所需的最低隔离度是多少?

确保只有一个SQL更新进行更改所需的最低隔离度是多少?,sql,isolation-level,Sql,Isolation Level,下面是一个带参数的SQL更新命令 UPDATE MyTable SET MyField = @newvalue, @success = 1 WHERE Id = @id AND MyField = @oldvalue 许多客户端将同时使用相同的@id和@oldvalue参数值运行此命令。我只希望其中一个是赢家,并将MyField设置为它自己的@newvalue,让它知道它赢了,因为@success输出参数将设置为1 为了保证只有一个客户会赢,这项工作所需的最低隔

下面是一个带参数的SQL更新命令

UPDATE MyTable 
SET MyField = @newvalue, 
    @success = 1
WHERE 
    Id = @id 
    AND MyField = @oldvalue
许多客户端将同时使用相同的@id和@oldvalue参数值运行此命令。我只希望其中一个是赢家,并将MyField设置为它自己的@newvalue,让它知道它赢了,因为@success输出参数将设置为1

为了保证只有一个客户会赢,这项工作所需的最低隔离级别是多少?我需要这一对账单的交易吗


我使用的是SQL Server 2008,但我希望有一个标准的SQL答案。

如果新值始终与旧值不同,那么默认的隔离级别READ COMMITTED就足够了


但是,如果该值最终可能与旧值相同,则所有客户机都将成功。一个接一个。每个都有@success=1。

如果新值总是不同于旧值,那么默认隔离级别READ COMMITTED就足够了

但是,如果该值最终可能与旧值相同,则所有客户机都将成功。一个接一个。每个都有@success=1。

在更新的读取阶段,SQL Server UPDATE语句将始终放置U UPDATE锁,然后升级为X排他锁,用于将新值实际写入要更新的行或页/表的过程,而不管使用哪种事务隔离级别

由于一个U锁与同一级别上的另一个U锁不兼容,因此如果一个进程已经有一个U锁,则其他连接无法同时启动更新,并且必须等待

再次强调:这是SQL Server的标准行为—无论您使用的是哪种事务隔离级别—所有这些隔离级别都是相同的

我不知道这句话是否适用于其他RDBMS系统——很可能不适用。任何ANSI SQL标准都不会处理这些类型的事情-这些都是非常特定于供应商的。

SQL Server UPDATE语句将在更新的读取阶段始终放置U UPDATE锁,然后升级为X排他锁,用于将新值实际写入要更新的行或页/表的过程,而不管使用哪种事务隔离级别

由于一个U锁与同一级别上的另一个U锁不兼容,因此如果一个进程已经有一个U锁,则其他连接无法同时启动更新,并且必须等待

再次强调:这是SQL Server的标准行为—无论您使用的是哪种事务隔离级别—所有这些隔离级别都是相同的


我不知道这句话是否适用于其他RDBMS系统——很可能不适用。任何ANSI SQL标准都不会处理这类问题—这些问题通常都是特定于供应商的。

SQL Server行为已经涵盖,但我将在问题的这一部分展开讨论,询问标准SQL答案


我不知道有哪种RDBMS需要比READ COMMITTED更严格的隔离级别才能获得您所要求的行为,前提是如前所述,新值不同于旧值。我相信SQL标准中的各种事务隔离级别的要求应该保证任何符合标准的数据库产品都能做到这一点。其他答案中描述的锁类型并不总是强制执行这一点,但大多数系统都使用某种阻塞锁来提供这一保证。

SQL Server行为已经涵盖,但我将在问题的一部分展开,询问标准SQL答案


我不知道有哪种RDBMS需要比READ COMMITTED更严格的隔离级别才能获得您所要求的行为,前提是如前所述,新值不同于旧值。我相信SQL标准中的各种事务隔离级别的要求应该保证任何符合标准的数据库产品都能做到这一点。其他答案中描述的锁类型并不总是强制执行这一点,但大多数系统都使用某种阻塞锁来提供这种保证。

@JackManey并不迂腐,但从技术上讲,更新锁是放在桌面上的。@MichaelFredrickson-我一眼就想到了这一点,但是对排他锁的描述是@MichaelFredrickson:do be very pedantic:首先在读取要更新的数据的表上放置一个更新锁U,然后在数据的写入部分期间,该U锁升级为X排他锁update@marc_s-谢谢你的澄清@JackManey不是学究,但从技术上讲,一个更新锁放在桌子上。@MichaelFredrickson-我一眼就想到了这一点,但对独占锁的描述是@MichaelFredrickson:一定要学究:首先是一个更新锁
在读取要更新的数据时,将U放在表上,然后在数据的写入部分期间,该U锁升级为X排他锁update@marc_s-谢谢你的澄清!