首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

关于mysql锁机制——mysql各种锁的学习(一)

和数据库打交道的过程中我们经常会听到悲观锁、乐观锁、表锁、行锁等等,其实我对这些概念也不是很清楚,今天就先和大家一起学习下各种锁的概念。

在计算机中,锁是协调多个进程或县城并发访问某一资源的一种机制。在数据库当中,除了传统的计算资源(CPU、RAM、I/O等等)的争用之外,数据也是一种供许多用户共享访问的资源。如何保证数据并发访问的一致性、有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素。从这一角度来说,锁对于数据库而言就显得尤为重要。

关于mysql的更多内容建议参考官方文档:https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html

mysql数据库的锁机制其实比较简单的,如果按照常用的两种存储引擎即MyISAM和InnoDB划分的话,MyISAM只支持表锁,而InnoDB支持的是表锁和行锁。我查到的资料显示mysql也支持页锁(只是存储引擎不同)。这里的表锁、页锁、行锁是根据锁的粒度划分的,按照粒度大小:表锁>页锁>行锁。下面从并发性能、加锁开销、死锁等几个方面对比一下

表锁:表锁的粒度最大,当然发生锁冲突的概率也最大,不会出现死锁,加锁的开销比较小,并发性能很低。

行锁:行锁的粒度最小,当然发生锁冲突的概率也最小,会出现死锁,加锁的开销比较大,并发性能较高。

页锁:锁的粒度、发生冲突的概率和加锁的开销等处于表锁和行锁之间,会出现死锁,并发性能一般

InnoDB和MyISAM对比

一、MyISAM存储引擎的特性

二、InnoDB存储引擎的特性

mysql默认的存储引擎是InnoDB,而且实际中InnoDB的应用相对MyISAM来说更广泛些,所以今天主要学习下InnoDB存储引擎的锁机制。

InnoDB存储引擎使用的锁的类型有 Shared and Exclusive Locks(共享和排它锁)、Intention Locks(意向锁)、Record Locks、GAP Locks、 Next-Key Locks、Insert Intention Locks(插入意向锁)、AUTO-INC Locks、Predicate Locks for Spatial Indexes,其他的我也不知道怎么翻译比较好,就不翻译了.....

Shared and Exclusive Locks: 包含共享锁(也称s锁)和排它锁(也称x锁)这两个都属于行锁。

共享锁允许持有该锁的事务读取一行数据。

排它锁允许持有该锁的事务更新或删除一行数据。

举一个例子,有事务T1和事务T2

如果T1持有某一行的共享锁,那么T2请求共享锁的时候会立刻得到共享锁,这样T2可以读取这一行的数据。但是如果T2请求的是排它锁,那么T2不能立刻获得排它锁(文档原文:A request by T2 for an X lock cannot be granted immediately.那么意思是T2需要等待直到T1释放共享锁??这一点有点疑问,如有清楚的小伙伴请指明)。换句话说一旦某一行加上共享锁后只支持读操作,也就是只支持共享锁。

如果T1持有的是某一行的排它锁,那么T2请求的这一行的锁都不会立刻得到,T2必须等待T1释放排它锁。换句话说一旦某一行已经被排它锁锁定,那么其他事务既不能进行读操作也不能进行写操作。排它锁排斥所有的其他行级锁。

根据以上内容感觉共享锁和排它锁和JAVA 中的读锁/写锁非常相似。

Intention Locks:即意向锁,意向锁属于表锁,因为InnoDB支持多粒度锁定,就是允许表锁和行锁共存。意向锁表示事务接下来对表中的某一行准备使用那种行锁。因此又分为意向共享锁(也称IS锁)和意向排它锁(也称IX锁)

需要注意的是:在事务获取表中某行的共享锁之前,事务必须先要获取意向共享锁或者更强的锁(这一点有点疑问);

在事务获取表中某行的排它锁之前,事务必须先要获取意向排它锁;

关于共享锁、排它锁、意向共享锁等的兼容性如下图:

从下图也可以看出排它锁与其他的锁都是冲突的。

今天就先写到这里,关于其他锁的内容,下次再进行补充.......关于上面的一些疑问如有清楚的,还希望指点一下,谢谢大家!

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180304G0RBH800?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券