范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

白熊原创MySQL锁

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

9世纪的唐朝人比17世纪人类要更了解月球,他们说月球是人类造的酉阳杂俎唐代小说,作者是段成式。作为笔记小说集,有前卷20卷,续集10卷。这本书的性质,据作者自序,固役不耻者,抑志怪小说之书也。所记有仙佛鬼怪人事以至动物植物酒食寺庙等等,分类编人类到底有有没有登陆过月球,数据告诉你不仅有,而且还有12个时至今日,仍然有很多人对美国四十年前登月的事件保持怀疑的态度。但是实际上,却有12个人类踏上过月球,留下了足印。这是全部人类登陆过月球的人数。除了我们比较熟悉的阿姆斯特朗,奥尔德林冷战中那些天马行空的装备,连磁爆步兵都出现了如果没有核的诞生,按照十九二十世纪战争的频率人类现在大概已经迎来四战了在冷战期间。有一大批无法想象的装逼被推倒了历史的舞台。1苏联大伊万(沙皇炸弹)苏联大伊万众所周知,伊万以其50苏联多少黑科技留存?至今无法突破(DON2N雷达站)DON2N雷达站1994年2月美国发现号航天飞机从外太空扔下几个金属球,想测试一下世界超视距雷达效果,包括想看看Don2N雷达站到底怎么样。最终发现,在全世界的雷达中,只有DON2苏联首次拍摄月球背面高清照片暴露了月球表面的飞船?月球被潮汐力锁定,在绕轨道运行时保持一张面向地球的面,而人类从未见过它的另一面。计划E2是苏联月球探测的下一阶段,由凯尔迪什于1958年1月提出,它将拍摄月球背面并通过电视将图像传2018毕业季,820万毕业生之争,独门秘诀轻松拿offer据教育部公布,2018年全国普通高校毕业生人数达820万人,再创历年新高。大批应届生选择扎堆北上广等一线城市。此时的大4学生,有的被家里安排了朝九晚五的舒适工作,有的开始计划着创业央视开学第一课引热议孩子需要怎样的第一课?2018年9月1日晚,学生和家长们翘首以盼的品牌节目开学第一课在央视综合频道播出,和往年一样,家长要陪同孩子一起观看,并要求孩子写开学第一课观后感。节目一经播出,收视率跃居榜首。自中国将探索实施父母育儿假!白岩松应该上热搜有关网友,提出这样的问题,男性能不能休产假?是否可以提上日程?著名社会评论家,白岩松答道我希望我这个回答能上热搜。随后此话题果然登上热搜。该问题引起广泛关注,我们可以看到探索实施和中国纺织服装行业全生命周期评价工作组正式成立作为2020年中国纺织大会的五大板块之一,中国纺织服装行业社会责任年会于日前在中国山西太原成功举办,会上中国纺织服装行业全生命周期评价工作组正式宣布成立。经过近七个月的筹备,工作组细胞修复口服美白去皱产品悄燃来袭TRUNiagen乐加因最近的天气真的会热到融化,天气一热皮肤问题也随之多了起来,爆痘晒斑肌肤缺水等一系列问题层出不穷,简直和现在的天气一样让人抓狂。只想用买买买,来缓解一下烦躁的心情,可是看看家里满桌子高晓松26天减重26斤,网友在线求减肥教程11月24日,高晓松在社交平台晒出6张照片,并配文称第一个小目标已达成,26天减重26斤!这种用最低调的话,说最高调的事之凡尔赛版画风,瞬间吸引众多网友关注在照片中,高晓松身穿白色
英科学家研发可利用声音控制粒子的打印技术作者涂翠珊英国布里斯托大学(UniversityofBristol)与巴斯大学(UniversityofBath)科学团队研发出的最新声刻技术(sonolithography),是从嫦娥奔月到祝融赴火,科技让梦想不再遥远5月15日,我国首次火星探测任务天问一号探测器在火星乌托邦平原着陆,火星车祝融与着陆架分离,在这片红色的梦幻之地开启探测之旅。天问一号着陆火星的模拟图像这次任务不仅在火星上首次留下科学家如何唤醒每只鸡身上的恐龙?28年前,侏罗纪公园把这一梦想灌输到大多数人的脑海里现在,科学即将把这一梦想变成生物学上的事实!1993年,斯皮尔伯格执导的侏罗纪公园轰动全球,人们激动不已,恐龙从来没有如此真实过天舟二号推迟发射,期待问题及时解决,顺利发射原定,5月20日凌晨发射的天舟二号货运飞船,因为技术原因推迟发射,每一次进步的道路都不会一帆风顺,期待问题解决,顺利发射!让我们一起期待并祝福吧!我们再看看天舟二号这次的主要工作都为了中国走向宇宙更深处5月15日7时18分,火星探测器天问一号成功着陆火星。中国科学院空天信息创新研究院遥感科学国家重点实验室行星遥感团队(以下简称行星遥感团队)在北京航天飞行控制中心(以下简称北京飞控天舟二号不光运送物资,还执行其它任务,将与中国空间站多次对接原计划5月20日凌晨1点发射的天舟二号,却因为技术原因向后推迟,具体是什么原因,作为吃瓜群众的我们没有必要深究,就算深究了,你也搞不太明白。不过我们到是可以了解一下天舟2号究竟是个萤火虫选择SpaceX发射其月球着陆器,将NASA的有效载荷带到月球美国宇航局(NASA)授予总部位于德克萨斯州的萤火虫航空航天公司(FireflyAerospace)一份价值9330万美元的合同,将用其BlueGhost着陆器向月球表面部署10个有水的金星图令人惊叹的金星地球化图,可替代移居火星的计划简介一位网友发布了一张对金星进行宜居改造的计划图,该图使用了金星真实数据进行模拟,虽然有不小瑕疵,但引发网友对该话题热烈讨论。如果金星拥有和地球相似的水,金星将会是什么样的?一张地日月安属?列星安陈?人类对宇宙及火星的探索和遐想主题书单自4月24日第六个中国航天日以来,中国航天又迎来了几次突破和进展先是4月29日,中国首个空间站天和核心舱发射成功,准时进入预定轨道。中国载人空间站核心舱天和核心舱全长约18。1米,纽约市4倍大!南极洲一巨大冰块脱落,成为世界最大的漂浮冰山中新网5月20日电据外媒报道,欧洲航天局(ESA)19日表示,一块巨大的冰块从南极洲的冰冻边缘脱落,落入威德尔海,成为世界上最大的漂浮冰山。这座冰山比西班牙马略卡岛还大,约有美国纽为避免极端太阳喷发,美国宇航局必须在2026年前让人类重返月球?英国雷丁大学的一份新报告预测,在2026年到2030年之间,太阳将会爆发一系列大规模的等离子体,可能会使宇航员陷入危险之中。英国科学家警告称,美国宇航局必须在5年内将人类送上月球,