SQL Server - 是否有任何称为“脏写”的东西?

时间:2014-12-04 20:09:14

标签: sql-server transactions locking isolation-level

SQL Server是否允许事务修改当前正由另一个事务修改但尚未提交的数据?这是否可以在任何隔离级别下进行,让我们说READ UNCOMMITTED,因为这是限制性最小的?或者它是否完全阻止了这种情况的发生?你会称之为“肮脏的写作”吗?如果有可能吗?

2 个答案:

答案 0 :(得分:5)

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

SQL Server 必须确保可以回滚所有写入。这甚至对于单个语句也是如此,因为即使单个语句也会导致许多写入并运行数小时。

想象一下写了一行但需要回滚。但同时另一个写入发生在已经提交的那一行。现在我们无法回滚,因为这会违反为其他事务提供的持久性保证:写入将丢失。 (如果要回滚的行是其中几个写入的行之一,它也可能违反为其他事务提供的原子性保证。)

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

SQL Server从不允许脏写或丢失写入。

答案 1 :(得分:1)

不,除非您在同一个交易中更新,否则不能。将隔离级别设置为Read Uncommitted只会从表中读取数据,即使它尚未提交但您无法更新。

对于更新或删除语句,将忽略Read Uncommitted Isolation Level和nolock表提示,它将等待事务提交。