MySQL并发控制
- MySQL的并发控制使用锁机制和事务相配合实现,几乎所有数据库都需要有并发控制能力,数据库的作用
决定了其工作时必须能够处理大量的并发读和写。至于并发控制用到什么技术取决于各个数据库的数据
存储引擎,在MySQL的InnoDB数据存储引擎中,其支持锁机制和事务机制。而MyISAM数据引擎则不支持
事务,但是其支持锁机制。
一.MySQL的锁机制
- 几乎所有需要处理并发读/写的系统都会实现相应的锁系统,一般锁系统包含两类锁:共享锁(shared locks)
和排他锁(exclusive locks), 或者叫读锁(read locks)和写锁(write locks)。
1.1 锁分类
-
基于锁的功能:共享锁(shared locks)和排他锁(exclusive locks), 或者叫读锁(read locks)和
写锁(write locks) -
是否显式指定:
- 隐式锁:由存储引擎自动施加锁
- 显式锁:用户手动请求
1.2 锁粒度(Lock Granularity)
一种提高共享资源的并发性的做法是让资源具有更多的选择性,或者说以更小的粒度来区分资源;只对包含
需要改变的数据的部分进行加锁,而不是锁定整个资源块。但是锁是需要占用系统资源,需要开销的机制;
每个锁操作如:获取锁、检查某个锁是否是可用、释放锁等多种都会有额外开销。如果系统花费大量资源
在处理锁机制上而不实实在在的存储数据,那就会适得其反,拖累系统。
-
行级锁:InnoDB存储引擎提供到行级别的锁机制,也就是可以针对某个表的某个行或者某些行施加锁。
-
表级锁:MyISAM存储引擎提供到表级别的锁机制,也就是可以针对某个表施加锁。
-
另外在MySQL中支持MVCC:Multiversion Concurrency Control,其允许多个操作执行在某个表的同一行。
1.3 锁策略
-
锁策略是一种在锁机制的粒度和数据的安全性之间的平衡机制,该机制会影响性能
-
大部分商业数据库不会提供用户可控制的锁策略,MySQL的InnoDB自己会实现基于引擎存储层的锁策略和锁粒度。
-
在用户层和服务层则使