写锁与读锁

写锁

写锁(也称为排他锁)用于防止其他事务对锁定的数据进行写操作和读操作,确保数据在当前事务期间的完整性。

  1. 表级写锁

    • 锁定范围:锁定整张表。此锁会阻止其他事务对该表进行任何写操作(如 INSERTUPDATEDELETE),同时也阻止其他事务读取数据。
    • 行为
      • 阻止读取:其他事务的 SELECT 查询会被阻塞,直到写锁被释放。只有当前事务释放写锁后,其他事务才能对表进行读取操作。
    • 示例
      LOCK TABLES orders WRITE;
      -- 对 orders 表执行写操作
      UPDATE orders SET status = 'processed' WHERE id = 1;
      UNLOCK TABLES;
      
  2. 行级写锁

    • 锁定范围:锁定查询结果中的特定行。其他事务无法对这些行进行写操作,但可以读取这些行的数据(读取不会被阻塞)。
    • 行为
      • 读取不被阻塞:虽然行级写锁阻止了其他事务对这些行的修改,但它不会阻塞其他事务的 SELECT 查询。其他事务可以读取到这些行的数据快照(取决于事务的隔离级别)。
    • 示例
      BEGIN;
      -- 对特定行加写锁
      SELECT * FROM orders WHERE id = 1 FOR UPDATE;
      -- 执行写操作
      UPDATE orders SET status = 'processed' WHERE id = 1;
      COMMIT;
      

读锁

读锁(也称为共享锁)允许多个事务同时读取同一数据,但阻止任何事务对数据进行修改。

  1. 表级读锁

    • 锁定范围:锁定整张表。其他事务可以读取表中的数据,但不能对表进行写操作(如 INSERTUPDATEDELETE)。
    • 行为
      • 阻止写操作:其他事务的写操作会被阻塞,直到读锁被释放。写锁会被阻塞,直到读锁释放。
      • 允许读取:其他事务可以读取表中的数据,读取操作不会被阻塞。
    • 示例
      LOCK TABLES orders READ;
      -- 对 orders 表进行读取操作
      SELECT * FROM orders WHERE status = 'pending';
      UNLOCK TABLES;
      
  2. 行级读锁

    • 锁定范围:锁定查询结果中的特定行。其他事务可以读取这些行的数据,但不能对这些行进行修改。
    • 行为
      • 允许读取:其他事务的 SELECT 查询可以读取这些行的数据。读锁不会阻塞其他事务的读取操作,但会阻止对这些行的写操作。
    • 示例
      BEGIN;
      -- 对特定行加读锁
      SELECT * FROM orders WHERE id = 1 LOCK IN SHARE MODE;
      -- 执行读取操作
      SELECT * FROM orders WHERE status = 'pending';
      COMMIT;
      

总结

  • 表级写锁:会锁定整张表,阻止其他事务的读写操作。
  • 行级写锁:只锁定特定行,阻止其他事务修改这些行,但允许读取这些行的数据。
  • 表级读锁:锁定整张表,允许读取,但阻止写操作。
  • 行级读锁:锁定特定行,允许多个事务同时读取这些行,但阻止对这些行的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值