介绍
这篇文章主要介绍了MySQL锁机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。
锁在MySQL中是非常重要的一部分,锁对MySQL的数据访问并发有着举足轻重的影响。锁涉及到的知识篇幅也很多,所以要啃完并消化到自己的肚子里,是需要静下心好好反反复复几遍地细细品味。本文是对锁的一个大概的整理,一些相关深入的细节,还是需要找到相关书籍来继续夯实。
引用>
<强>锁的认识强>
<强> 1.1锁的解释强>
计算机协调多个进程或线程并发访问某一资源的机制。<强> 1.2锁的重要性强>
在数据库中,除传统计算资源(CPU、内存、I/O等)的争抢,数据也是一种供多用户共享的资源。 如何保证数据并发访问的一致性,有效性,是所有数据库必须要解决的问题。 锁冲突也是影响数据库并发访问性能的一个重要因素,因此锁对数据库尤其重要。<强> 1.3锁的缺点强>
加锁是消耗资源的,锁的各种操作,包括获得锁,检测锁是否已解除,释放锁等,,都会增加系统的开销。<强> 1.4简单的例子强>
现如今网购已经特别普遍了,比如淘宝双十一活动,当天的人流量是千万及亿级别的,但商家的库存是有限的。 系统为了保证商家的商品库存不发生超卖现象,会对商品的库存进行锁控制。当有用户正在下单某款商品最后一件时, 系统会立马对该件商品进行锁定,防止其他用户也重复下单,直到支付动作完成才会释放(支付成功则立即减库存售罄,支付失败则立即释放)。<强>锁的类型强>
<强> 2.1表锁强>
<>强种类强>
读锁(read 锁),也叫共享锁(shared 锁) 针对同一份数据,多个读操作可以同时进行而不会互相影响(select)写锁(write 锁),也叫排他锁(exclusive 锁) 当前操作没完成之前,会阻塞其它读和写操作(更新、插入、删除)<强>存储引擎默认锁强>
MyISAM<强>特点强>
1只对整张表加锁 2只开销小 3只加锁快 4只;无死锁 5只锁粒度大,发生锁冲突概率大,并发性低结论
1只,读锁会阻塞写操作,不会阻塞读操作 2只写锁会阻塞读和写操作建议
MyISAM的读写锁调度是写优先,这也是MyISAM不适合做写为主表的引擎,因为写锁以后,其它线程不能做任何操作,大量的更新使查询很难得到锁,从而造成永远阻塞。<强> 2.2行锁强>
<>强种类强>
读锁(read 锁),也叫共享锁(shared 锁) 允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁写锁(write 锁),也叫排他锁(exclusive 锁) 允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享锁和排他锁意向共享锁(是) 一个事务给一个数据行加共享锁时,必须先获得表的锁是意向排它锁(第九) 一个事务给一个数据行加排他锁时,必须先获得该表的IX锁存储引擎默认锁
InnoDB特点
1只对一行数据加锁 2只开销大 3只加锁慢 4只会出现死锁 5只锁粒度小,发生锁冲突概率最低,并发性高事务并发带来的问题
1只更新丢失 解决:让事务变成串行操作,而不是并发的操作,即对每个事务开始——对读取记录加排他锁 2只脏读 解决:隔离级别为Read 未提交 3只不可重读 解决:使用Next-Key 锁算法来避免 4只幻读 解决:间隙锁(Gap 锁)2.3页锁
开销,加锁时间和锁粒度介于表锁和行锁之间,会出现死锁,并发处理能力一般(此锁不做多介绍)<>强如何上锁吗?
MySQL锁机制的示例分析