表的类型
按照锁的类型分
读锁(共享锁)
-
针对同一份数据,多个读操作可以同时进行而不会互相影响。
-
若事务T对数据对象A加上读锁,则事务T只能读A
-
其他事务只能再对A加读锁,而不能加写锁,直到事务T释放A上的读锁
-
这就保证了其他事务可以读A,但在事务T释放A上的读锁之前不能对A做任何修改。
START TRANSACTION;
LOCK TABLES your_table_name READ;
-- 在这里执行需要对表进行的读操作,例如:
-- SELECT * FROM your_table_name WHERE condition;
UNLOCK TABLES;
COMMIT;
写锁(排他锁)
-
写锁只可以加一个,当前写操作没有完成前,它会阻断其他写锁和读锁。
-
若事务T对数据对象A加上写锁,则只允许事务T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。
-
在更新操作(
INSERT、UPDATE 或 DELETE
)过程中始终应用排它锁(自动隐式加上排他锁)
START TRANSACTION;
LOCK TABLES your_table_name WRITE;
-- 在这里执行需要对表进行的写操作,例如:
-- INSERT INTO your_table_name (column1, column2) VALUES ('value1', 'value2');
-- UPDATE your_table_name SET column1 = 'new_value' WHERE condition;
-- DELETE FROM your_table_name WHERE condition;
UNLOCK TABLES;
COMMIT;
按照锁的粒度分
页锁
介绍
页锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。
特点
开销和加锁时间界于表锁和行锁之间:会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
表锁
介绍
MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。
特点
表锁开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的概率最高,并发最低
行锁
介绍
MySQL中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。
特点
行锁开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
使用
-
自动行锁:MySQL的InnoDB存储引擎通过在事务隔离级别为可重复读或串行化时自动对读取操作进行行锁,确保事务的隔离性。不需要显式声明行锁。
-
手动指定行锁:可以使用
FOR UPDATE
和
LOCK IN SHARE MODE
子句显式指定行锁。
SELECT ... FOR UPDATE
:在读取数据时对选定的行加锁,其他会话不能修改或删除被锁定的行。SELECT ... LOCK IN SHARE MODE
:在读取数据时对选定的行共享锁,其他会话可以读取但不能修改被锁定的行。