城市直播房产教育博客汽车
投稿投诉
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

白熊原创MySQL锁

10月26日 心碎巷投稿
  MySQL锁
  在计算机中,是协调多个进程或县城并发访问某一资源的一种机制。在数据库当中,除了传统的计算资源(CPU、RAM、IO等等)的争用之外,数据也是一种供许多用户共享访问的资源。如何保证数据并发访问的一致性、有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素。从这一角度来说,锁对于数据库而言就显得尤为重要。MySQL锁
  相对于其他的数据库而言,MySQL的锁机制比较简单,最显著的特点就是不同的存储引擎支持不同的锁机制。根据不同的存储引擎,MySQL中锁的特性可以大致归纳如下:
  表级锁定(tablelevel)
  表级别的锁定是MySQL各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免困扰我们的死锁问题。
  当然,锁定颗粒度大所带来最大的负面影响就是出现锁定资源争用的概率也会最高,致使并大度大打折扣。
  使用表级锁定的主要是MyISAM,MEMORY,CSV等一些非事务性存储引擎。行级锁定(rowlevel)
  行级锁定最大的特点就是锁定对象的颗粒度很小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的。由于锁定颗粒度很小,所以发生锁定资源争用的概率也最小,能够给予应用程序尽可能大的并发处理能力而提高一些需要高并发应用系统的整体性能。
  虽然能够在并发处理能力上面有较大的优势,但是行级锁定也因此带来了不少弊端。由于锁定资源的颗粒度很小,所以每次获取锁和释放锁需要做的事情也更多,带来的消耗自然也就更大了。此外,行级锁定也最容易发生死锁。
  使用行级锁定的主要是InnoDB存储引擎。页级锁定(pagelevel)
  页级锁定是MySQL中比较独特的一种锁定级别,在其他数据库管理软件中也并不是太常见。页级锁定的特点是锁定颗粒度介于行级锁定与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力也同样是介于上面二者之间。另外,页级锁定和行级锁定一样,会发生死锁。
  在数据库实现资源锁定的过程中,随着锁定资源颗粒度的减小,锁定相同数据量的数据所需要消耗的内存数量是越来越多的,实现算法也会越来越复杂。不过,随着锁定资源颗粒度的减小,应用程序的访问请求遇到锁等待的可能性也会随之降低,系统整体并发度也随之提升。使用页级锁定的主要是BerkeleyDB存储引擎。
  总的来说,MySQL这3种锁的特性可大致归纳如下:
  表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;
  行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高;
  页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
  适用:从锁的角度来说,表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统。表级锁定1。MySQL表级锁的锁模式
  MySQL的表级锁有两种模式:表共享读锁(TableReadLock)和表独占写锁(TableWriteLock)。
  对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;对MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作;MyISAM表的读操作与写操作之间,以及写操作之间是串行的!根据如下表所示的例子可以知道,当一个线程获得对一个表的写锁后,只有持有锁的线程可以对表进行更新操作。其他线程的读、写操作都会等待,直到锁被释放为止。如何加表锁
  MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预,因此,用户一般不需要直接用LOCKTABLE命令给MyISAM表显式加锁。并发插入
  MyISAM表的读和写是串行的,但这是就总体而言的。在一定条件下,MyISAM表也支持查询和插入操作的并发进行。
  MyISAM存储引擎有一个系统变量concurrentinsert,专门用以控制其并发插入的行为,其值分别可以为0、1或2。
  当concurrentinsert设置为0时,不允许并发插入。
  当concurrentinsert设置为1时,如果MyISAM表中没有空洞(即表的中间没有被删除的行),MyISAM允许在一个进程读表的同时,另一个进程从表尾插入记录。这也是MySQL的默认设置。
  当concurrentinsert设置为2时,无论MyISAM表中有没有空洞,都允许在表尾并发插入记录。MySQL的锁调度
  MyISAM存储引擎的读锁和写锁是互斥的,读写操作是串行的。那么,一个进程请求某个MyISAM表的读锁,同时另一个进程也请求同一表的写锁,MySQL如何处理呢?答案是写进程先获得锁。不仅如此,即使读请求先到锁等待队列,写请求后到,写锁也会插到读锁请求之前!这是因为MySQL认为写请求一般比读请求要重要。这也正是MyISAM表不太适合于有大量更新操作和查询操作应用的原因,因为,大量的更新操作会造成查询操作很难获得读锁,从而可能永远阻塞。这种情况有时可能会变得非常糟糕!幸好我们可以通过一些设置来调节MyISAM的调度行为。
  通过指定启动参数lowpriorityupdates,使MyISAM引擎默认给予读请求以优先的权利。
  通过执行命令SETLOWPRIORITYUPDATES1,使该连接发出的更新请求优先级降低。
  通过指定INSERT、UPDATE、DELETE语句的LOWPRIORITY属性,降低该语句的优先级。
  虽然上面3种方法都是要么更新优先,要么查询优先的方法,但还是可以用其来解决查询相对重要的应用(如用户登录系统)中,读锁等待严重的问题。
  另外,MySQL也提供了一种折中的办法来调节读写冲突,即给系统参数maxwritelockcount设置一个合适的值,当一个表的读锁达到这个值后,MySQL就暂时将写请求的优先级降低,给读进程一定获得锁的机会。
  上面已经讨论了写优先调度机制带来的问题和解决办法。这里还要强调一点:一些需要长时间运行的查询操作,也会使写进程饿死!因此,应用中应尽量避免出现长时间运行的查询操作,不要总想用一条SELECT语句来解决问题,因为这种看似巧妙的SQL语句,往往比较复杂,执行时间较长,在可能的情况下可以通过使用中间表等措施对SQL语句做一定的分解,使每一步查询都能在较短时间完成,从而减少锁冲突。如果复杂查询不可避免,应尽量安排在数据库空闲时段执行,比如一些定期统计可以安排在夜间执行。行级锁定
  InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁。行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题。下面我们先介绍一点背景知识,然后详细讨论InnoDB的锁问题。1。事务(Transaction)及其ACID属性
  事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性。
  原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。
  一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的。
  隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的独立环境执行。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。
  持久性(Durable):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。
  银行转帐就是事务的一个典型例子。并发事务处理带来的问题
  相对于串行处理来说,并发事务处理能大大增加数据库资源的利用率,提高数据库系统的事务吞吐量,从而可以支持更多的用户。但并发事务处理也会带来一些问题,主要包括以下几种情况。
  更新丢失(LostUpdate)
  当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题最后的更新覆盖了由其他事务所做的更新。例如,两个编辑人员制作了同一文档的电子副本。每个编辑人员独立地更改其副本,然后保存更改后的副本,这样就覆盖了原始文档。最后保存其更改副本的编辑人员覆盖另一个编辑人员所做的更改。如果在一个编辑人员完成并提交事务之前,另一个编辑人员不能访问同一文件,则可避免此问题。
  脏读(DirtyReads)
  个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些脏数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象地叫做脏读。
  不可重复读(NonRepeatableReads)
  一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变、或某些记录已经被删除了!这种现象就叫做不可重复读。
  幻读(PhantomReads)
  一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为幻读。事务隔离级别
  在上面讲到的并发事务处理带来的问题中,更新丢失通常是应该完全避免的。但防止更新丢失,并不能单靠数据库事务控制器来解决,需要应用程序对要更新的数据加必要的锁来解决,因此,防止更新丢失应该是应用的责任。
  脏读、不可重复读和幻读,其实都是数据库读一致性问题,必须由数据库提供一定的事务隔离机制来解决。数据库实现事务隔离的方式,基本上可分为以下两种。
  一种是在读取数据前,对其加锁,阻止其他事务对数据进行修改。
  另一种是不用加任何锁,通过一定机制生成一个数据请求时间点的一致性数据快照(Snapshot),并用这个快照来提供一定级别(语句级或事务级)的一致性读取。从用户的角度来看,好像是数据库可以提供同一数据的多个版本,因此,这种技术叫做数据多版本并发控制(MultiVersionConcurrencyControl,简称MVCC或MCC),也经常称为多版本数据库。
  数据库的事务隔离越严格,并发副作用越小,但付出的代价也就越大,因为事务隔离实质上就是使事务在一定程度上串行化进行,这显然与并发是矛盾的。同时,不同的应用对读一致性和事务隔离程度的要求也是不同的,比如许多应用对不可重复读和幻读并不敏感,可能更关心数据并发访问的能力。
  为了解决隔离与并发的矛盾,ISOANSISQL92定义了4个事务隔离级别,每个级别的隔离程度不同,允许出现的副作用也不同,应用可以根据自己的业务逻辑要求,通过选择不同的隔离级别来平衡隔离与并发的矛盾。下表很好地概括了这4个隔离级别的特性。
  Innodb的行锁模式及加锁方法
  InnoDB实现了以下两种类型的行锁。
  共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
  排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。另外,为了允许行锁和表锁共存,实现多粒度锁机制,InnoDB还有两种内部使用的意向锁(IntentionLocks),这两种意向锁都是表锁。
  意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。
  意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。
  上述锁模式的兼容情况具体如下表所示。
  如果一个事务请求的锁模式与当前的锁兼容,InnoDB就将请求的锁授予该事务;反之,如果两者不兼容,该事务就要等待锁释放。
  意向锁是InnoDB自动加的,不需用户干预。对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);对于普通SELECT语句,InnoDB不会加任何锁;事务可以通过以下语句显示给记录集加共享锁或排他锁。
  共享锁(S):SELECTFROMtablenameWHERE。。。LOCKINSHAREMODE。
  排他锁(X):SELECTFROMtablenameWHERE。。。FORUPDATE。
  用SELECT。。。INSHAREMODE获得共享锁,主要用在需要数据依存关系时来确认某行记录是否存在,并确保没有人对这个记录进行UPDATE或者DELETE操作。但是如果当前事务也需要对该记录进行更新操作,则很有可能造成死锁,对于锁定行记录后需要进行更新操作的应用,应该使用SELECT。。。FORUPDATE方式获得排他锁。InoDB行锁实现方式
  InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!
  在实际应用中,要特别注意InnoDB行锁的这一特性,不然的话,可能导致大量的锁冲突,从而影响并发性能。间隙锁(nextkey锁)
  当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做间隙(GAP),InnoDB也会对这个间隙加锁,这种锁机制就是所谓的间隙锁(NextKey锁)。
  举例来说,假如emp表中只有101条记录,其empid的值分别是1,2,。。。,100,101,下面的SQL:
  Selectfromempwhereempid100
  是一个范围条件的检索,InnoDB不仅会对符合条件的empid值为101的记录加锁,也会对empid大于101(这些记录并不存在)的间隙加锁。
  InnoDB使用间隙锁的目的,一方面是为了防止幻读,以满足相关隔离级别的要求,对于上面的例子,要是不使用间隙锁,如果其他事务插入了empid大于100的任何记录,那么本事务如果再次执行上述语句,就会发生幻读;另外一方面,是为了满足其恢复和复制的需要。有关其恢复和复制对锁机制的影响,以及不同隔离级别下InnoDB使用间隙锁的情况。
  很显然,在使用范围条件检索并锁定记录时,InnoDB这种加锁机制会阻塞符合条件范围内键值的并发插入,这往往会造成严重的锁等待。因此,在实际应用开发中,尤其是并发插入比较多的应用,我们要尽量优化业务逻辑,尽量使用相等条件来访问更新数据,避免使用范围条件。
  还要特别说明的是,InnoDB除了通过范围条件加锁时使用间隙锁外,如果使用相等条件请求给一个不存在的记录加锁,InnoDB也会使用间隙锁!
投诉 评论 转载

醒酒最快的办法是啥(醒酒最快的办法)醒酒最快的办法是啥(醒酒最快的办法)春节越来越近了,不少的朋友开始在寻找各种的解酒妙招了。年底是公司聚会聚餐频繁的时刻,春节是各种亲朋好友相聚的时刻。而每一次的聚会都会喝……中国大地保险内蒙古分公司扎实开展党史学习教育杜雪记者赵修彬开展党史学习教育以来,中国大地保险内蒙古分公司引导广大党员干部学史明理、学史增信、学史崇德、学史力行,守正创新、锐意进取,以更加昂扬的姿态全面开创新时代现代……星座运势分析狮子座女生喜欢什么类型男生,一起来看看今天呢我们来聊一下狮子座女生,她喜欢什么样的男生呢?在爱情中,狮子座女生脾气会比较不太好。可以说是非常强势,所以这种强势的女生她到底喜欢什么样子的男孩子呢?当然是温……什么叫民事责任(安全生产法规定的民事责任存在的若干问题)什么叫民事责任(《安全生产法》规定的民事责任存在的若干问题)《安全生产法》规定的民事责任存在的若干问题《安全生产法》第一百一十六条规定了,生产安全事故造成人员伤亡,……纵横大鹏无人机输电通道智能巡检方案,又获奖啦4月22日,第六届全国无人机电力巡检技术高峰论坛,在合肥盛大开幕,纵横股份携带CW15二代、CW25ELiDAR亮相本次论坛。在同期举行的2021年金巡奖第三届全国电力巡……白熊原创MySQL锁MySQL锁在计算机中,是协调多个进程或县城并发访问某一资源的一种机制。在数据库当中,除了传统的计算资源(CPU、RAM、IO等等)的争用之外,数据也是一种供许多用户共享……omega是什么意思(生活小常识omega是什么意思)omega是什么意思(生活小常识:omega是什么意思)omega是同性恋小说中衍生出的人物分类,是完全的受方的意思,在ABO的世界观中,omega男性只能被一个alph……建议扩大杰青数量!FUTURE暮成雪选编近日,国家自然科学基金委员会网站发布《国家自然科学基金2019年度绩效评价报告》。受国家自然科学基金委员会委托,国家科技评估中心作为第三方机构承担了……火箭实验室发射芬兰立方体卫星设计用于测试卫星离轨技术的芬兰立方体卫星将在最初在Momentus拖船上发射延迟后,在RocketLabElectron上发射。火箭实验室(RocketLab)于8月16……2019年之后,我们需要什么样的建筑?公认的伟大建筑,往往可以代表一个时代的精神、一座城市的审美。伟大建筑往往达到了当时工程技术的极限,而且由于建筑的体量巨大,相比起其他的艺术形式,更能体现一个文明的价值观。……寻隐者不遇的全诗意思(今天来学寻隐者不遇)寻隐者不遇的全诗意思(今天来学《寻隐者不遇》)寻隐者不遇唐代:贾岛松下问童子,言师采药去。只在此山中,云深不知处。译文苍松下询问年少的学童,他说他的师傅……日常知识荷兰旅游是什么体验在我们的生活当中有很多的常识性的知识大多数人都是不知道的,就好比最近就有很多小伙伴咨询小编问小编关于荷兰旅游是什么体验的这些知识点,这就说明了现在人们也开开渐渐关注起了荷兰旅游……
售价媲美一辆车龙江和牛拟借IPO闯关产业链规模化无心法师柳青鸾结局是什么柳青鸾为什么黑化了不安的造句用不安的造句大全紫贝风雷香奈儿春夏广告大片超模琳赛威克森萨沙露丝演绎这几个女生主导的前戏技巧助你调教出忠犬男友校园里的植物中国将于至年底发射天宫一号飞行器孕期感冒易加重这样解决更靠谱出境游恢复中东南亚游春节将重启,欧美游或翻倍涨至人均超2万元乐歌助您养成影响一生的微习惯鲜衣怒马展少年风华

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找