锁:

读锁:共享锁
写锁:独占锁

锁粒度:

表级锁
行级锁

锁策略:在锁粒度及数据安全性寻求的平衡机制;
  每种存储引擎都可以自行实现其锁策略和锁粒度;
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等都是显式锁

注意: 建议使用隐式锁

原文地址:https://www.cnblogs.com/ckh2014/p/14468372.html