【问题标题】:How does transaction isolation level work with respect to read/writes and read/write locks?事务隔离级别如何处理读/写和读/写锁?
【发布时间】:2021-05-23 02:09:18
【问题描述】:

我了解脏读、不可重复读和幻读问题。

我还阅读了有关隔离级别的信息:未提交读、已提交读、可重复读、可序列化。

我也明白读取会导致共享锁。要获得共享锁,不应该已经有一个活动的排他锁。其中插入/更新/删除会导致排他锁。要获得排他锁,不应该有任何其他排他或共享锁处于活动状态。

对于每个级别,我读过的文章都没有解释隔离级别的概念:

  1. 该级别是否适用于读取或写入事务或两者。

  2. 读/写是否强制执行任何与上述解释不同的读/写锁

  3. 事务是关于写入的全有或全无的概念。而事务隔离级别是关于只读的概念吗?

如果有人能对每个级别的这些要点进行启发,那将非常有帮助。

【问题讨论】:

  • 我认为the documentation 很清楚: 1. 控制 Transact-SQL 语句的锁定和行版本控制行为。正如它的名字一样,它控制着一个会话中的所有事务。没有理由在此声明的描述中隐藏一些细节(我希望 MS 公布文章中所有案例的例外情况)。 2. 选择事务隔离级别不会影响为保护数据修改而获取的锁.

标签: sql sql-server sql-server-2016


【解决方案1】:

你可能会找到these articles by Paul White to be very useful。

但在回答您的问题时:

首先,共享锁和排他锁定义了允许同时发生的锁。隔离级别定义了锁定的数量和锁定时间。

  1. 隔离级别适用于两种类型的事务。 SNAPSHOT 尤其具有不同的效果,具体取决于是否涉及写入。
  2. 还有 Intent 锁,它们是其他锁的等效版本,允许将锁从页锁或行锁升级到表/分区。
    您还拥有 Schema Modification 锁,可防止任何人从您下方更改表/列(或索引)定义(这适用于 甚至 至 NOLOCK)。
  3. 隔离级别定义了多少被锁定,是一行还是一个范围?它还指示锁在使用后会发生什么。它是一直保留到事务结束,还是在提交发生后立即释放?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多