锁:
读锁:共享锁 写锁:独占锁
锁粒度:
表级锁 行级锁
锁策略:在锁粒度及数据安全性寻求的平衡机制;
每种存储引擎都可以自行实现其锁策略和锁粒度;
MySQL在服务器级也实现了锁,表级锁;
用户可显示请求施加锁;
(1) LOCK TABLES tbl_name [[AS] alias] lock_type [, tbl_name [[AS] alias] lock_type] ... lock_type: READ [LOCAL] | [LOW_PRIORITY] WRITE UNLOCK TABLES
示例:为了便于测试,我们将自动添加的锁关掉:
SET GLOBAL innodb_table_locks = OFF
施加读锁: LOCK TABLES students READ; //此时,其他会话可以继续查询,但不能执行更新、插入等操作 施加写锁: LOCK TABLES students WRITE; //此时,其他会话不可以查询,也不可以进行更新等操作 解锁: UNLOCK TABLES;
(2)FLUSH TABLES tb_name[,...] [WITH {READ | WRITE} LOCK]
示例:
施加读锁:FLUSH TABLES students WITH READ LOCK; 施加写锁:FLUSH TABLES students WHTH WRITE LOCK;
解锁:UNLOCK TABLES;
(3) SELECT clause FOR UPDATE
示例:此种方式需要在事务中生效
关掉自动提交事务的功能:SET GLOBAL autocommit = OFF;
查询数据并施加一个更新锁:SELECT * FORM students FOR UPDATE; //此时,其他会话可以查询数据但不能进行更新等操作
手动提交事务: commit; // 只有当commit提交事务之后,其他会话才能进行更新操作。
锁分类:
隐式锁: 由存储引擎自动施加锁 显示锁: LOCK TABLES等都是显式锁
注意: 建议使用隐式锁