读锁和写锁

44

我对读写锁不太确定,需要有人帮忙确认以下关于读写锁的事实是否正确。

这是一般数据库的参考。

读锁:

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

写锁:

  1. 当一行/表被写锁定时,如果其他线程具有已实现的读锁,则另一个线程无法读取它,但如果没有实现读锁(即简单的选择查询),则其他线程可以读取它。

感谢澄清。我在互联网上找不到直接证明这些说法的内容。

3个回答

27
在数据库管理理论中,锁定用于在多个数据库用户事务之间实现隔离。这是ACID(原子性、一致性、隔离性、持久性)缩写中的"I"。 TX(事务)对数据应用锁定,可能会阻止其他TX在TX生命周期内访问相同的数据。
简单锁定:可以请求两种主要类型的锁:
- 共享锁定:读取锁定,即任何其他TX(或多个TX)都可以读取但不能写入(与多个txs共享锁定即共享锁定)。 - 排它锁定:写锁定,即没有其他TX可以读取或写入(不与任何其他txs共享锁定即独占锁定)。
多重锁定:2PL(两阶段锁定)是一种并发控制方法,可保证可串行性。
- 增长/扩展/第一阶段:获取锁定并且不释放锁定。 - 缩小/收缩/第二阶段:释放锁定并且不获取锁定。

22

读锁:

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

    正确。多个读锁可以同时存在。(读锁又称为共享锁)

  2. 当一个线程对一行/表具有读锁时,其他线程不能对该表执行更新/插入/删除数据的操作。(即使尝试写入数据的线程不需要写锁)

    正确。写事务应等待读锁完成读取。

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

    正确。如果先持有写锁再持有读锁,则写锁将阻止其他事务读取或写入同一表。如果先持有读锁再持有写锁,则读锁将阻止写事务,直到读取事务完成。

写锁:

  1. 当行/表具有写锁时,如果其他线程已经实现了读锁,则它们无法读取该行/表,但如果没有实现读锁(即简单的Select查询),则其他线程可以读取。

    抱歉,我不理解这句话的意思。 但是,当一个表具有写锁(独占锁)时,其他事务无法读取或写入。


我认为@nknj的最后一句话的意思是,如果另一个事务设置了读取未提交的事务隔离级别 - 在这种情况下,它不需要获取共享锁,并且被允许读取尚未提交的行。 - Utkarsh

2

这是否意味着锁没有特定的含义,而是隔离级别中的一种抽象? - Johnny_D
不,锁有非常具体的含义。隔离是关于锁的使用方式。 - amit kumar
请问您能否分享一些关于锁的链接或文章名称。谢谢。 - Johnny_D
我不是专家,但有中级知识。关于锁定的内容可以参考:http://en.wikipedia.org/wiki/Lock_(computer_science),关于需要隔离的数据库事务处理可以参考:http://en.wikipedia.org/wiki/Transaction_processing。 - amit kumar
1
因为答案可以更详细,所以我会给它点个踩。 - Niklas Ekman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接