写锁
写锁(也称为排他锁)用于防止其他事务对锁定的数据进行写操作和读操作,确保数据在当前事务期间的完整性。
-
表级写锁:
- 锁定范围:锁定整张表。此锁会阻止其他事务对该表进行任何写操作(如
INSERT
、UPDATE
、DELETE
),同时也阻止其他事务读取数据。 - 行为:
- 阻止读取:其他事务的
SELECT
查询会被阻塞,直到写锁被释放。只有当前事务释放写锁后,其他事务才能对表进行读取操作。
- 阻止读取:其他事务的
- 示例:
LOCK TABLES orders WRITE; -- 对 orders 表执行写操作 UPDATE orders SET status = 'processed' WHERE id = 1; UNLOCK TABLES;
- 锁定范围:锁定整张表。此锁会阻止其他事务对该表进行任何写操作(如
-
行级写锁:
- 锁定范围:锁定查询结果中的特定行。其他事务无法对这些行进行写操作,但可以读取这些行的数据(读取不会被阻塞)。
- 行为:
- 读取不被阻塞:虽然行级写锁阻止了其他事务对这些行的修改,但它不会阻塞其他事务的
SELECT
查询。其他事务可以读取到这些行的数据快照(取决于事务的隔离级别)。
- 读取不被阻塞:虽然行级写锁阻止了其他事务对这些行的修改,但它不会阻塞其他事务的
- 示例:
BEGIN; -- 对特定行加写锁 SELECT * FROM orders WHERE id = 1 FOR UPDATE; -- 执行写操作 UPDATE orders SET status = 'processed' WHERE id = 1; COMMIT;
读锁
读锁(也称为共享锁)允许多个事务同时读取同一数据,但阻止任何事务对数据进行修改。
-
表级读锁:
- 锁定范围:锁定整张表。其他事务可以读取表中的数据,但不能对表进行写操作(如
INSERT
、UPDATE
、DELETE
)。 - 行为:
- 阻止写操作:其他事务的写操作会被阻塞,直到读锁被释放。写锁会被阻塞,直到读锁释放。
- 允许读取:其他事务可以读取表中的数据,读取操作不会被阻塞。
- 示例:
LOCK TABLES orders READ; -- 对 orders 表进行读取操作 SELECT * FROM orders WHERE status = 'pending'; UNLOCK TABLES;
- 锁定范围:锁定整张表。其他事务可以读取表中的数据,但不能对表进行写操作(如
-
行级读锁:
- 锁定范围:锁定查询结果中的特定行。其他事务可以读取这些行的数据,但不能对这些行进行修改。
- 行为:
- 允许读取:其他事务的
SELECT
查询可以读取这些行的数据。读锁不会阻塞其他事务的读取操作,但会阻止对这些行的写操作。
- 允许读取:其他事务的
- 示例:
BEGIN; -- 对特定行加读锁 SELECT * FROM orders WHERE id = 1 LOCK IN SHARE MODE; -- 执行读取操作 SELECT * FROM orders WHERE status = 'pending'; COMMIT;
总结
- 表级写锁:会锁定整张表,阻止其他事务的读写操作。
- 行级写锁:只锁定特定行,阻止其他事务修改这些行,但允许读取这些行的数据。
- 表级读锁:锁定整张表,允许读取,但阻止写操作。
- 行级读锁:锁定特定行,允许多个事务同时读取这些行,但阻止对这些行的修改。