MySQL并发控制的主要手段就是锁,锁主要分为两种:
1、共享锁(也叫读锁)。
2、排它锁(也叫写锁),写锁会阻塞其它的读锁与写锁。
———————————————————————————————————————————————————————
说道锁,那么就一定要了解锁的粒度,MySQL中锁的粒度大可分为三种(不同的存储引擎支持的锁粒度不一样,目前高版本的MySQL默认使用InnoDB引擎,它默认为行级锁):
开销 |
加锁速度 |
是否会出现死锁 |
并发读与性能 |
|
表级锁 |
小 |
快 |
不会 |
并发度低,性能最差 |
行级锁 |
大 |
慢 |
会 |
并发度高,性能最高 |
页级锁 |
介于表级锁与行级锁之间 |
介于表级锁与行级锁之间 |
会 |
介于表级锁与行级锁之间 |
———————————————————————————————————————————————————————
1、事务的四大特性:
———————————————————————————————————————————————————————
2、事务的隔离级别:
脏读:事务可以读取到其它未提交的数据。
幻读:事务A读1到5的数据,此时1-5会被事务A上锁,然后事务B插入一条数据6,并执行了commit。此时事务A如果再查询的话就会查到数据6,这就像幻觉一样,但MySQL通过MVCC使得数据6并不会被查询出来(虽然不会被查询出来,但却不能插入数据6,因为库里已经存在了数据6)。总得来说幻读就是当事务不独立执行时发生的一种现象,当第一个事务涉及到全表修改,第二个事务插入一行新数据,此时便会发生操作第一个事务的用户发现表中还有未修改的数据,就像发生幻觉一样。
———————————————————————————————————————————————————————
3、死锁:
死锁是指,多个两个及以上的事务对统一资源的占用,并请求锁定对方占用的资源。
如以下情况:
-- 事务一 start transaction; update t_customers set name = ‘小明1‘ where id = 1; update t_customers set name = ‘小华1‘ where id = 2; commit; -- 事务二 start transaction; update t_customers set name = ‘小华2‘ where id = 2; update t_customers set name = ‘小明2‘ where id = 1; commit;
若两个事务都执行了第一条update语句,锁定了各自的资源后,那么执行第二条语句时就会出现死锁的情况。
而InnoDB目前处理死锁的方法是,将持有最少行级排它锁的事务进行回滚(这是相对比较简单的死锁回滚算法),如果数量相同,就会回滚最后尝试获取锁的事务。
———————————————————————————————————————————————————————
4、MVCC:多版本并发控制,可以认为MVCC就是行级锁的一个变种,但是他在很多情况下避免了加锁操作。
MVCC是通过保存数据在某个时间点的快照来实现的,因MVCC没有一个同意的标准,所以各自的实现都不一样。
在InnoDB引擎是通过在每列数据后添加两个隐藏的列来实现,一列保存行数据创建时间(版本号),一列是行数据删除时间(版本号)。
比如在REPEATABLE READ隔离级别下:
MVCC只在REPEATABLE READ和READ COMMITTED两个隔离级别下工作。因为READ UNCOMMITTED总是读取最新的数据行,而不是符合当前事务版本的数据行。
而SERIALIZABLE则会对所有读取的行都加锁。
InnoDB引擎:InnoDB表基于聚簇索引建立,其索引结构和MySQL的其他?引擎有很大差别,从磁盘读取数据时采用的可预测性预读。
大致可从4个方面优化:
1、硬件
2、系统配置优化
3、数据表结构优化
4、SQL及索引优化
原文:https://www.cnblogs.com/bzfsdr/p/12303957.html