深入理解Mysql——锁与事务隔离级别
这里写目录标题
锁分类
从性能上分类:乐观锁和悲观锁
从数据库操作类型分类:读锁和写锁
从数据操作粒度分类:表锁和行锁
表锁
每次加锁锁住整张表,开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲 突的概率最高,并发度最低;
对于不同的数据库引擎,有不同的设定
MyISAM中只有表锁,没有行锁。
MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,
在执行增删改 操作前,会自动给涉及的表加写锁。
对MyISAM表的读操作(加读锁) ,不会阻寒其他进程对同一表的读请求,但会阻赛对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
对MylSAM表的写操作(加写锁) ,会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。
行锁
每次操作锁住一个数据行。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁 冲突的概率最低,并发度最高。
InnoDB支持:事务&& 行锁
事务的ACID:Atomicity(原子性),Consistent(一致性),Isolation(隔离性),Durable(持久性)
并发事务的问题:更新丢失(Lost Update),脏读(Dirty Reads),不可重读(Non-Repeatable Reads),幻读(Phantom Reads)。
间隙锁
间隙锁可以解决幻读问题。
如果新建的数据行是在锁划分的间隙范围内,则其他Session没法在这个范围所包含的间隙里插入或修改任何数据。
事务隔离级别
项目 | 脏读 | 可重复读 | 幻读 |
---|---|---|---|
Read-Uncommitted | 可能 | 可能 | 可能 |
Read-Committed | 不可能 | 可能 | 可能 |
Repeatable-Read | 不可能 | 不可能 | 可能 |
Serializable | 不可能 | 不可能 | 不可能 |
常看当前数据库的事务隔离级别: show variables like ‘tx_isolation’;
设置事务隔离级别:set tx_isolation=‘REPEATABLE-READ’;
MVCC机制
每一次的修改数据,都会生成新的快照。
我们要找的就是在事务正式开始前的最近一次更新的快照。
当事务开始,就会有MySQL分配的事务id,先执行的id小,后执行的id值会增加。
如果当前id值为12 ,那么在执行查询操作时,会带上id=12 ,并且实现MVCC机制:
创建事务id <= 12(当前事务id,快照点已提交最大事务id),删除事务id> 12(当前事务id,快照点已提交最大事务id),满足这一条件的快照会被返回。
- 【深入理解】Mysql锁与事务隔离级别
- 深入理解mysql之BDB系列(1)---BDB相关基础知识
- MySQL中group_concat函数深入理解
- [深入理解MySQL系列] - sort_buffer
- 从程序员的角度深入理解MySQL 推荐
- 深入理解 MySQL ——锁、事务与并发控制
- [转]深入理解SET NAMES和mysql(i)_set_charset的区别
- MySQL中group_concat函数深入理解
- 【数据库】mysql深入理解乐观锁与悲观锁
- MySql学习(七) —— 查询性能优化 深入理解MySql如何执行查询
- 深入理解 MySQL 底层实现
- 【转】深入理解MySQL字符集和字符序列
- MySQL中group_concat函数深入理解
- 深入理解 MySQL ——锁、事务与并发控制
- [转]深入理解SET NAMES和mysql(i)_set_charset的区别
- MySQL复制之深入理解binlog_format及表字段顺序的重要性
- MySql学习(七) —— 查询性能优化 深入理解MySql如何执行查询
- 深入理解Mysql——锁、事务与并发控制
- 深入理解mysqldump参数 --single-transaction --lock-all-tables
- MySql学习(七) —— 查询性能优化 深入理解MySql如何执行查询