MySQL逻辑架构
并发控制
这里只针对服务器层与存储引擎层的并发控制
读写锁
- 共享锁,又称读锁,读锁是共享的,多个客户同时读取统一资源互不干扰
- 排他锁,又称写锁,写锁是排他的,一个客户获取写锁则会阻塞其他客户的读锁和写锁
锁粒度
获取锁、检查锁是否解除、释放锁都会占用系统资源,增加系统开销。所谓合适的锁粒度,就是在锁的开销和数据的安全性之间寻找平衡
-
表锁,MySQL中最基本的锁策略,会锁定整张表,开销最小。用户在对表进行写操作前,需要先获得写锁,这会阻塞其他用户对该表的读写操作
-
行级锁,最大程度地支持并发处理(同时也带来了最大的锁开销)。行级锁是在存储引擎层实现,而MySQL服务层没有实现
事务
-
原子性(atomicity)
一个事务为一个不可分割的最小单元,要么全部提交成功,要么全部失败回滚
-
一致性(consistency)
数据库总是从一个一致性的状态转换到另外一个一致性的状态。 -
隔离型(isolation)
两个不同事务互不干扰 -
持久性
事务一旦提交,对数据的修改是永久性的
隔离级别
隔离级别 | 脏读可能性 | 不可重复读可能性 | 幻读可能性 | 加锁读 |
---|---|---|---|---|
READ UNCOMMITTED(读未提交) | yes | yes | yes | no |
READ COMMITTED(读已提交) | no | yes | yes | no |
REPEATABLE READ(可重复读),MySQL默认隔离级别 | no | no | yes | no |
SERIALIZABLE(可串性化) | no | no | no | Yes |
死锁
死锁是指两个或者多个事务在统一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。
死锁发生后,只有部分或者完全回滚其中一个事务,才能打破死锁。