mysql锁类型
数据库锁设计主要是用于处理并发问题,当出现并发访问的时候,数据库需要合理的控制资源的访问规则。
按照所的粒度划分
- 全局锁
全局锁就是对整个数据库实例加锁,mysql提供了一个全局读加锁的方法,命令是:Flush tables with read lock 。当你需要让整个库出于只读状态的时候,可以使用这个命令,之后其他线程的语句会被阻塞,包括增、删、改,数据库结构的修改和更新类食物的提交。典型的使用场景是做全库逻辑备份。 - 表锁
表锁是mysql锁中粒度最大的一种锁,表示当前的操作对整张表加锁,资源开销比行锁少,不会出现死锁的情况,但是发生锁冲突的概率很大。被大部分的mysql引擎支持。表锁的语法是 lock tables … read/write。可以用 unlock tables 主动释放锁,也可以在客户端断开的时候自动释放。 - 页锁
页级锁是mysql中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。BDB支持页级锁。 - 行锁
行级锁是mysql中锁定粒度最小的一种锁,只针对当前操作的行进行加锁,是在引擎层由各个引擎自己实现的,但并不是所有的存储引擎都支持,MyISAM就不支持,InnoDB支持。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。有可能会出现死锁的情况。
按照锁的使用方式划分
- 排他锁
排他锁又称写锁,如果事务T对数据A加上排他锁,那么其他事务不能再对A加任何类型的操作,但是T既能读数据,也能修改数据。 - 共享锁
共享锁又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但是不能进行修改,知道共享锁释放。
按照锁思想划分
- 悲观锁
悲观锁是指对数据被外界修改保持保守态度,因此在整个数据处理过程,将数据出于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制。对目标记录进行修改前,先试着给它加上锁,如果加锁成功,那么在解锁前,任何其他操作都会抛出异常。 - 乐观锁
乐观锁一般假定数据不会造成冲突,所以只有在数据提交更新的时候,才会正式对数据冲突与否进行检测,如果发现冲突了,则返回错误信息,让用户决定如何操作。