【问题标题】:Read Locks and Write Locks读锁和写锁
【发布时间】:2011-12-04 12:15:58
【问题描述】:

我对读写锁有点不确定,只需要有人检查这些关于读/写锁的事实是否正确。

这是对一般数据库的参考。

读锁:

  1. 多个线程可以同时获取多个读锁。
  2. 当线程在行/表上具有读锁时,没有线程可以更新/插入/删除该表中的数据。 (即使尝试写入数据的线程不需要写锁。)
  3. 行/表不能同时拥有读锁和写锁。

写锁:

  1. 当一个行/表有写锁时,如果它们实现了读锁,则不能被另一个线程读取,但如果没有实现读锁,则可以被其他线程读取(即简单的选择查询)李>

感谢您的澄清。我在互联网上找不到对这些陈述的直接断言。

【问题讨论】:

    标签: database multithreading concurrency transactions locking


    【解决方案1】:

    数据库管理理论中,锁用于在多个数据库用户txn之间实现isolation。这是首字母缩略词ACID(原子性、一致性、隔离性、持久性)中的“我”。锁由 TX(事务)应用于数据,这可能会阻止其他 TX 在 TX 生命周期内访问相同的数据。

    简单锁定:可以请求两种主要类型的锁定:

    • 共享锁:读锁,即任何其他 TX(或多个 TX)可以读取但不能写入(与多个 tx 共享锁,即共享锁)
    • 独占锁:写锁,即没有其他 TX 可以读取或写入(锁不与任何其他 txs 共享,即独占锁)

    多重锁定: 两相锁定(2PL)是一种保证可串行化的并发控制方法。

    • A Growing/Expanding/First Phase:获得了锁而没有释放任何锁。
    • 收缩/收缩/第二阶段:释放锁,不获取锁。

    【讨论】:

      【解决方案2】:

      读锁:

      1. 多个线程可以同时获取多个读锁。

        没错。多个读锁可以同时存在。 (读锁还有一个名字:共享锁)

      2. 当线程在行/表上具有读锁时,没有线程可以更新/插入/删除该表中的数据。 (即使尝试写数据的线程不需要写锁。)

        没错。写事务应该等待读锁读完。

      3. 行/表不能同时拥有读锁和写锁。

        没错。如果在读锁之前有写锁,写锁会阻塞其他事务读取或写入同一张表。如果在写锁之前有读锁,读锁会阻塞写事务,直到读事务完成。

      写锁:

      1. 当一个行/表有写锁时,如果其中实现了读锁,则不能被另一个线程读取,但如果没有实现读锁,则可以被其他线程读取(即简单的选择查询)

        对不起,我不明白这句话。 但是当一个表有写锁(Exclusive Lock)时,它不能被另一个事务读写。

      【讨论】:

      • 我认为对于最后一条语句,@nknj 的意思是,如果另一个事务的事务隔离级别设置为 READ_UNCOMMITED - 在这种情况下,它不需要共享锁并且可以读取尚未提交的行。
      【解决方案3】:

      这取决于使用的isolation 级别。

      【讨论】:

      • 是不是说没有锁的具体含义,是隔离级别的抽象?
      • 不,锁有一个非常具体的含义。隔离是关于锁的使用方式。
      • 你能分享一些链接,或者可能是关于锁的文章名称。谢谢。
      • 我不是这方面的专家,虽然有中级知识。但这里有一些关于锁的内容:en.wikipedia.org/wiki/Lock_(computer_science) 以及需要隔离的数据库中的事务处理:en.wikipedia.org/wiki/Transaction_processing
      • 投反对票,因为答案可能更详细。
      猜你喜欢
      • 2015-05-24
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 2014-12-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多