SQL Server-是否有所谓的“脏写”之类的东西?

use*_*660 5 sql-server locking transactions isolation-level

SQL Server是否允许事务修改另一个事务当前正在修改但尚未提交的数据?在任何隔离级别下都可以做到这一点,比如说“读未提交”,因为这是限制性最低的吗?还是完全阻止了这种情况的发生?如果可能的话,您会称之为“脏写”吗?

usr*_*usr 6

任何提供事务和事务原子性的RDBMS都不允许脏写。

SQL Server 必须确保可以回滚所有写操作。即使对于单个语句也是如此,因为即使单个语句也可能导致大量写操作并运行数小时。

想象写了一行,但是需要回滚。但是与此同时,对已提交的行进行了另一次写操作。现在我们无法回滚,因为这将违反为另一个事务提供的持久性保证:写入将丢失。(如果要回滚的行是其若干写入行之一,则这也可能违反为该其他事务提供的原子性保证)。

唯一的解决方案是始终使用X锁来稳定写入但未提交的数据。

SQL Server永远不允许脏写或丢失写。