百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>数据库> mysql数据库锁机制的介绍
分享文章到:

mysql数据库锁机制的介绍

发布时间:08/01 来源:未知 浏览: 关键词:
?本篇文章给大家带来的内容是对于mysql数据库锁机制的介绍,有一定的参照 价值,有需要的伴侣可以参照 一下,但愿对你有所帮忙。

本篇文章给大家带来的内容是对于mysql数据库锁机制的介绍,有一定的参照 价值,有需要的伴侣可以参照 一下,但愿对你有所帮忙。

并发控制

  • 数据库治理系统中的并发控制的任务是确保在多个事务同时存取数据库中统一数据时不毁坏事务的隔离性和同一性以及数据库的同一性。

  • 封闭,工夫戳,悲观并发控制和乐观并发控制是并发控制主要采纳的技术伎俩

当并发事务同时拜访一个资源时,有可能致使数据纷歧致,因而需要一种机制来将数据拜访次序化,以保障数据库数据的一致性。锁就是其中的一种机制(举荐教程:MySQL教程)

锁的分类

  • 按照操纵划分,可分为DML锁,DDL锁

  • 按锁粒度划分,可分为表级锁,行级锁,页级锁(mysql)

  • 按锁级别划分,可分为同享锁,排他锁

  • 按加锁方式划分,可分为主动锁,显示锁

  • 按运用方式划分,可分为悲观锁,乐观锁

DML锁用于维护数据的完备性,其中包含行级锁(TX锁),表级锁(TM锁)。DDL锁用于维护数据库对象的构造,如表,索引等的构造定义,其中包含排他DDL锁,同享DDL锁,可中止解析锁

行级锁

  • 行级锁是Mysql中锁定力度最细的一种锁,表示只针对目前操纵的行进行加锁。行级锁能大大减少数据库操纵的冲突。其加锁粒度最小,但是加锁的开销也最大。行级锁分为同享锁排他锁

  • 特色:开销大,加锁慢;会涌现死锁;锁定粒度最小,产生锁冲突的概率最低,并发度也最高

表级锁

  • 表级锁是Mysql中锁定粒度最大的一种锁,表示对目前操纵的整张表加锁,它实现简略,资源耗损较少,被大局部Mysql引擎支撑。最常见运用的MYISAM与INNODB都支撑表级锁定。表级锁定分为表分享读锁(同享锁)表独有写锁(排他锁)

  • 特色:开销小,加锁快;不会涌现死锁;锁定粒度大,发出锁冲突的概率最高,并发性最低

页级锁

  • 页级锁是Mysql中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但是冲突多,行级冲突少,但是速度慢。页级锁折中,以此锁定相邻的一组纪录。BDB支撑页级锁

Mysql常用存储引擎的锁机制

  • MyISAM和MEMORY采纳表级锁

  • BDB采纳页级锁或表级锁,默许是页级锁

  • InnoDB支撑行级锁和表级锁,默许为行级锁

InnoDB的行锁和表锁

InnoDB引擎中既支撑行锁也支撑表锁,那么什么时候会锁住整张表,什么时候锁住一行??

  • InnoDB行锁是通过给索引上的索引项加锁实现的,这点Mysql跟Oracle不一样,后者是通过在数据块中对响应数据行加锁来实现的。InnoDB这种行锁实现特色意味着:只要通过索引前提检索数据,InnoDB才运用行级锁,不然InnoDb将运用表锁

  • 现实利用中,要注意InnoDB行锁的这一特性,不然容易致使批量的锁冲突,从而影响并发机能

    • 在欠亨过索引前提查询的时候,InnoDB运用的是表锁,而不是行锁

    • 因为MySQL的行锁是针对索引加的锁,不是针对纪录加的锁,所以虽然拜访不一样行的纪录,但是要是运用雷同索引的键,是会涌现锁冲突的。

    • 当表有多个索引的时候,不一样的事务可以运用不一样的索引锁定不一样的行,别的岂论是运用主键索引,独一索引还是普通索引,InnoDB都会运用行锁来对数据加锁

    • 即使在前提中运用了索引字段,但可否运用索引来检索数据是由Mysql通过推断不一样之行规划的代价来决议的,要是Mysql以为全表扫效率更高,比方对一些很小的表,它就不会运用索引,这种状况InnoDB将运用表锁而不是行锁。因而剖析锁冲突的时候,别忘怀检查SQL的施行规划

行级锁和死锁

  • MyISAM是不会发生死锁的,由于MyISAM总是一次性获得所需的全部锁,要末全部知足,要末全部期待。而在InnoDB中,锁是逐渐获得的,就造成死锁的可能

  • 在MySQL中,行级锁并不是直接锁纪录,而是锁索引。索引分为主键索引和非主键索引两种,要是一条sql语句操纵了主键索引,MySQL就会锁住这条主键索引;要是一条语句操纵了非主键索引,MySQL就会先锁定该非主键索引,再锁定相干的主键索引。在Update,delete操纵时,MySQL不仅锁定where前提扫描过的所有索引记载,并且会锁定相邻的键值,即所谓的next-key locking

  • 死锁:当两个事务同时施行,一个锁住了主键索引,在期待其他相干索引。另一个锁定了非主键索引,在期待主键索引。这样就产生死锁。

  • 产生死锁后,InnoDB个别都可以检测到,并使一个事务开释锁回退,另一个猎取锁完成事务

以免死锁

  • 要是不一样程序会并发存取多个表,尽量约定以雷同的次序拜访表,可以大大落低死锁时机

  • 在统一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁发生概率

  • 关于非常容易发生死锁的业务局部,可以尝试运用升级锁定颗粒度,通过表级锁定来减少死锁

同享锁和排他锁

  • 行级锁是MySQL中锁定粒度最细的一种锁,行级锁能够大大减少数据库操纵的冲突。行级锁分为同享锁和排他锁

1. 同享锁
  • 同享锁又称读锁,是读取操纵新建的锁。其他会员可以并发读取数据,但任何事务都不克不及对数据进行修改,直到已开释所有同享锁。

  • 要是事务T对数据A加上同享锁后,那么其他事务只能对A再加同享锁,不克不及加排他锁。获准同享锁的事务只能读数据,不克不及修改数据

  • 要是事务T对数据A加上同享锁后,又对数据进行修改,那么其他事务将不克不及猎取同享锁;一样的,若多个事务对统一数据猎取同享锁,则任何事务不克不及对该数据进行修改

  • 用途: SSELECT ... LOCK IN SHARE MODE

    在查询语句背面添加LOCK IN SHARE MODE,Mysql会对查询效果中的每行都加同享锁,当没有其他线程对查询效果集中的任何一行运用排他锁时,可以成功申请同享锁,不然会被阻塞。其他线程也可以读取运用了同享锁的表,并且这些线程读取到的是统一个版本的数据

2. 排他锁
  • 排他锁又称写锁,要是事务T对数据A加上排他锁后,则其他事务不克不及再对A加任何类型的封闭。猎取排他锁的事务既能读数据,又能修改数据

  • 用途:SELECT ... FOR UPDATE 。在查询语句背面添加FOR UPDATE,MySQL会对查询效果中的每行都加排他锁,当没有其他线程对查询效果集的任何一行运用排他锁时,可以成功申请排他锁,不然会被阻塞

3. 意向锁
  • 意向锁是表级锁,其设计目的是为了在一个事务中揭示下一行将要被要求锁的类型。InnoDB中的两个表锁:

    • 意向同享锁(IS):表示事务预备给数据行参加同享锁,也便是说一个数据行加同享锁前必需先取得该表的IS锁

    • 意向排他锁(IX):表示事务预备给数据行参加排他锁,注明事务在一个数据行加排他锁前必需先去的该表的IX锁

  • 意向锁是InnoDB主动加的,不需要会员干涉

总结

关于insert,update,delete,InnoDB会主动给波及到的数据加排他锁;关于个别的Select语句,InnoDB不会加任何锁,事务可以通过下列语句给显式加上同享锁或排他锁

  • 同享锁:select ... LOCK IN SHARE MODE

  • 排他锁:SELECT ... FOR UPDATE

以上就是mysql数据库锁机制的介绍的细致内容,更多请关注 百分百源码网 其它相干文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有155人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板