MySQL锁机制的示例分析

  介绍

这篇文章主要介绍了MySQL锁机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。

锁在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锁机制的示例分析