【问题标题】:What lock type is used in READ COMMITTED isolation level?READ COMMITTED 隔离级别使用什么锁类型?
【发布时间】:2014-09-18 23:04:11
【问题描述】:

我在一篇 Wikipedia 文章中发现了一个矛盾之处,并且不确定错误在哪里(或者我可能没有正确理解)。

根据读取提交隔离级别中的Wikipedia

"在这个隔离级别,一个基于锁的并发控制DBMS 实现保持写锁(在选定数据上获取),直到 事务结束,但读锁在事务结束后立即释放 执行SELECT操作(所以出现不可重复读现象 可以在此隔离级别发生,如下所述)"

进一步解释Non-repeatable reads phenomena可能发生在读取提交的隔离级别:

交易1:

SELECT * FROM users WHERE id = 1;

事务2:

UPDATE users SET age = 21 WHERE id = 1; COMMIT;

交易1:

SELECT * FROM users WHERE id = 1; COMMIT;

根据第一个引号,应该在第一个事务中的第一个 select 语句之后获得写锁。如果这种锁类型应该是独占的,那么第二个事务如何成功获取写锁并提交? DBMS 真的对选定的数据保持写锁吗?

【问题讨论】:

    标签: database transactions isolation-level


    【解决方案1】:

    维基百科有两个错误:

    1. 这是一个实现细节。 RDBMS 不必那样做。通过使用快照隔离,READ COMMITTED 可以在完全没有读取锁的情况下实现。
    2. 据我所知,没有任何 RDBMS 为读取获取写入锁。这句话模棱两可。

    【讨论】:

    • READ COMMITTED can be implemented without locks for reads at all by using snapshot isolation:我对这样的实现很感兴趣。您介意为此声明提供一些参考吗?谢谢。
    • @hengxin 从只读快照读取时,您只读取已提交的数据。这里的所有都是它的。这是一个微不足道的结果,因为快照读取比 RC 读取强得多。
    • 是的,我明白了。谢谢。顺便说一句,您知道任何无锁(也没有写锁)RC 实现吗?
    • @hengxin SQL Server Hekaton 有。他们在任何情况下都不使用锁,但他们提供 SI 甚至是完整的(不是假的)可序列化的。我认为迷人的工程。
    猜你喜欢
    • 2012-07-04
    • 2019-06-18
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多