保健励志美文体育育儿作文
投稿投诉
作文动态
热点娱乐
育儿情感
教程科技
体育养生
教案探索
美文旅游
财经日志
励志范文
论文时尚
保健游戏
护肤业界

MySQL的事务原理详解,一文让你搞懂

  事务(ACID)
  场景:小明向小强转账10元原子性(Atomicity)
  转账操作是一个不可分割的操作,要么转失败,要么转成功,不能存在中间的状态,也就是转了一半的这种情况。我们把这种要么全做,要么全不做的规则称之为原子性。隔离性(lsolation)
  另外一个场景:
  1。小明向小强转账10元
  2。小明向小红转账10元
  隔离性表示上面两个操作是不能相互影响的一致性(Consistency)
  对于上面的转账场景,一致性表示每一次转账完成后,都需要保证整个系统的余额等于所有账户的收入减去所有账户的支出。
  如果不遵循原子性,也就是如果小明向小强转账10元,但是只转了一半,小明账户少了10元,小强账户并没有增加,所以没有满足一致性了。
  同样,如果不满足隔离性,也有可能导致破坏一致性。
  所以说,数据库某些操作的原子性和隔离性都是保证一致性的一种手段,在操作执行完成后保证符合所有既定的约束则是一种结果。
  实际上我们也可以对表建立约束来保证一致性。持久性(Durability)
  对于转账的交易记录,需要永久保存。事务的概念
  我们把需要保证原子性、隔离性、一致性和持久性的一个或多个数据库操作称之为一个事务。事务的使用开启事务
  BEGIN语句代表开启一个事务,后边的单词WORK可有可无。开启事务后,就可以继续写若干条语句,这些语句
  都属于刚刚开启的这个事务。
  BEGIN〔WORK〕mysqlBEGIN;
  QueryOK,0rowsaffected(0。00sec)
  mysqlsql。。。STARTTRANSACTION
  STARTTRANSACTION语句和BEGIN语句有着相同的功效,都标志着开启一个事务,比如这样:mysqlSTARTTRANSACTION;
  QueryOK,0rowsaffected(0。00sec)
  mysqlsql。。。提交事务mysqlBEGIN;
  QueryOK,0rowsaffected(0。00sec)
  mysqlUPDATEaccountSETbalancebalance10WHEREid1;
  QueryOK,1rowaffected(0。02sec)
  Rowsmatched:1Changed:1Warnings:0
  mysqlUPDATEaccountSETbalancebalance10WHEREid2;
  QueryOK,1rowaffected(0。00sec)
  Rowsmatched:1Changed:1Warnings:0
  mysqlCOMMIT;
  QueryOK,0rowsaffected(0。00sec)手动终止事务mysqlBEGIN;QueryOK,0rowsaffected(0。00sec)mysqlUPDATE
  accountSETbalancebalance10WHEREid1;QueryOK,1row
  affected(0。00sec)Rowsmatched:1Changed:1Warnings:0mysql
  UPDATEaccountSETbalancebalance1WHEREid2;QueryOK,1row
  affected(0。00sec)Rowsmatched:1Changed:1Warnings:0mysql
  ROLLBACK;QueryOK,0rowsaffected(0。00sec)
  这里需要强调一下,ROLLBACK语句是我们程序员手动的去回滚事务时才去使用的,如果事务在执行过程中遇到了某些错误而无法继续执行的话,事务自身会自动的回滚。自动提交
  mysqlSHOWVARIABLESLIKEautocommit;
  默认情况下,如果我们不显式的使用STARTTRANSACTION或者BEGIN语句开启一个事务,那么每一条语句都算是一个独立的事务,这种特性称之为事务的自动提交
  如果我们想关闭这种自动提交的功能,可以使用下边两种方法之一:
  显式的的使用STARTTRANSACTION或者BEGIN语句开启一个事务。这样在本次事务提交或者回
  滚前会暂时关闭掉自动提交的功能。
  把系统变量autocommit的值设置为OFF,就像这样:SETautocommitOFF;这样的话,我们写入的多条语句就算是属于同一个事务了,直到我们显式的写出COMMIT语句来把这个事务提交掉,或者显式的写出ROLLBACK语句来把这个事务回滚掉隐式提交
  当我们使用STARTTRANSACTION或者BEGIN语句开启了一个事务,或者把系统变量autocommit的值设置为OFF时,事务就不会进行自动提交,但是如果我们输入了某些语句之后就会悄悄的提交掉,就像我们输入了COMMIT语句了一样,这种因为某些特殊的语句而导致事务提交的情况称为隐式提交,这些会导致事务隐式提交的语句包括:定义或修改数据库对象的数据定义语言(Datadefinitionlanguage,缩写为:DDL)。所谓的数据库对象,指的就是数据库、表、视图、存储过程等等这些东西。当我们使用CREATE、ALTER、DROP等语句去修改这些所谓的数据库对象时,就会隐式的提交前边语句所属于的事务。隐式使用或修改mysql数据库中的表:当我们使用ALTERUSER、CREATEUSER、DROPUSER、GRANT、RENAMEUSER、SETPASSWORD等语句时也会隐式的提交前边语句所属于的事务。事务控制或关于锁定的语句:当我们在一个事务还没提交或者回滚时就又使用STARTTRANSACTION或者BEGIN语句开启了另一个事务时,会隐式的提交上一个事务。或者当前的autocommit系统变量的值为OFF,我们手动把它调为ON时,也会隐式的提交前边语句所属的事务。或者使用LOCKTABLES、UNLOCKTABLES等关于锁定的语句也会隐式的提交前边语句所属的事务。加载数据的语句:比如我们使用LOADDATA语句来批量往数据库中导入数据时,也会隐式的提交前边语句所属的事务。其它的一些语句:使用ANALYZETABLE、CACHEINDEX、CHECKTABLE、FLUSH、LOADINDEXINTOCACHE、OPTIMIZETABLE、REPAIRTABLE、RESET等语句也会隐式的提交前边语句所属的事务。保存点
  如果你开启了一个事务,并且已经敲了很多语句,忽然发现上一条语句有点问题,你只好使用ROLLBACK语句来让数据库状态恢复到事务执行之前的样子,然后一切从头再来,总有一种一夜回到解放前的感觉。所以MYSQL提出了一个保存点(英文:savepoint)的概念,就是在事务对应的数据库语句中打几个点,我们在调用ROLLBACK语句时可以指定会滚到哪个点,而不是回到最初的原点。定义保存点的语法如下:
  SAVEPOINT保存点名称;
  当我们想回滚到某个保存点时,可以使用下边这个语句(下边语句中的单词WORK和SAVEPOINT是可有可无的):
  ROLLBACK〔WORK〕TO〔SAVEPOINT〕保存点名称;
  不过如果ROLLBACK语句后边不跟随保存点名称的话,会直接回滚到事务执行之前的状态。
  如果我们想删除某个保存点,可以使用这个语句:
  RELEASESAVEPOINT保存点名称;隔离性详解修改隔离级别
  mysqlsetsessiontransactionisolationlevelreaduncommitted;
  查看隔离级别
  mysqlselecttxisolation;读已提交(READUNCOMMITTED)
  一个事务可以读到其他事务还没有提交的数据,会出现脏读。
  一个事务读到了另一个未提交事务修改过的数据,这就是脏读。读未提交(READCOMMITTED)
  一个事务只能读到另一个已经提交的事务修改过的数据,并且其他事务每对该数据进行一次修改并提交后,该事务都能查询得到最新值,会出现不可重复读、幻读。
  如果一个事务先根据某些条件查询出一些记录,之后另一个事务又向表中插入了符合这些条件的记录,原先的事务再次按照该条件查询时,能把另一个事务插入的记录也读出来,这就是幻读。可重复读(REPEATABLEREAD)
  一个事务第一次读过某条记录后,即使其他事务修改了该记录的值并且提交,该事务之后再读该条记录时,读到的仍是第一次读到的值,而不是每次都读到不同的数据,这就是可重复读,这种隔离级别解决了不可重复,但是还是会出现幻读。串行化(SERIALIZABLE)
  以上3种隔离级别都允许对同一条记录同时进行读读、读写、写读的并发操作,如果我们不允许读写、写读的并发操作,可以使用SERIALIZABLE隔离级别,这种隔离基金因为对同一条记录的操作都是串行的,所以不会出现脏读、幻读等现象。总结READUNCOMMITTED隔离级别下,可能发生脏读脏读、不可重复读、、幻读问题。READCOMMITTED隔离级别下,可能发生不可重复读不可重复读和幻读问题,但是不会发生问题,但是不会发生脏读问题。REPEATABLEREAD隔离级别下,可能发生幻读幻读问题,不会发生脏读脏读和不可重复读的题。SERIALIZABLE隔离级别下,各种问题都不可以发生。
  注意:这四种隔离级别是SQL的标准定义,不同的数据库会有不同的实现,特别需要注意的是MySQL在在REPEATABLEREAD隔离级别下,是可以禁止幻读问题的发生的隔离级别下,是可以禁止幻读问题的发生的。版本链
  对于使用InnoDB存储引擎的表来说,它的聚簇索引记录中都包含两个必要的隐藏列(rowid并不是必要的,我们创建的表中有主键或者非NULL唯一键时都不会包含rowid列):trxid:每次对某条记录进行改动时,都会把对应的事务id赋值给trxid隐藏列。rollpointer:每次对某条记录进行改动时,这个隐藏列会存一个指针,可以通过这个指针找到该记录修改前的信息。Readview
  对于使用READUNCOMMITTED隔离级别的事务来说,直接读取记录的最新版本就好了,对于使用SERIALIZABLE隔离级别的事务来说,使用加锁的方式来访问记录。对于使用READCOMMITTED和REPEATABLEREAD隔离级别的事务来说,就需要用到我们上边所说的版本链了,核心问题就是:需要判断一下版本链中的哪个版本是当前事务可见的。
  ReadView中主要包含4个比较重要的内容:
  1。mids:表示在生成ReadView时当前系统中活跃的读写事务的事务id列表。
  2。mintrxid:表示在生成ReadView时当前系统中活跃的读写事务中最小的事务id,也就是mids中的最小值。
  3。maxtrxid:表示生成ReadView时系统中应该分配给下一个事务的id值。
  4。creatortrxid:表示生成该ReadView的事务的事务id。
  注意:maxtrxid并不是mids中的最大值,事务id是递增分配的。比方说现在有id为1,2,3这三个事务,之后id为3的事务提交了。那么一个新的读事务在生成ReadView时,mids就包括1和2,mintrxid的值就是1,maxtrxid的值就是4。
  有了这个ReadView,这样在访问某条记录时,只需要按照下边的步骤判断记录的某个版本是否可见:如果被访问版本的trxid属性值与ReadView中的creatortrxid值相同,意味着当前事务在访问它自己修改过的记录,所以该版本可以被当前事务访问。如果被访问版本的trxid属性值小于ReadView中的mintrxid值,表明生成该版本的事务在当前事务生成ReadView前已经提交,所以该版本可以被当前事务访问。如果被访问版本的trxid属性值大于ReadView中的maxtrxid值,表明生成该版本的事务在当前事务生成ReadView后才开启,所以该版本不可以被当前事务访问。如果被访问版本的trxid属性值在ReadView的mintrxid和maxtrxid之间,那就需要判断一下trxid属性值是不是在mids列表中,如果在,说明创建ReadView时生成该版本的事务还是活跃的,该版本不可以被访问;如果不在,说明创建ReadView时生成该版本的事务已经被提交,该版本可以被访问READCOMMITTED的实现方式
  每次读取数据前都生成一个ReadView
  REPEATABLEREAD的实现方式
  在第一次读取数据时生成一个ReadViewMVCC总结
  MVCC(MultiVersionConcurrencyControl,多版本并发控制)指的就是在使用READCOMMITTD、REPEATABLEREAD这两种隔离级别的事务在执行普通的SEELCT操作时访问记录的版本链的过程。可以使不同事务的读写、写读操作并发执行,从而提升系统性能。READCOMMITTD、REPEATABLEREAD这两个隔离级别的一个很大不同就是:生成ReadView的时机不同,READCOMMITTD在每一次进行普通SELECT操作前都会生成一个ReadView,而REPEATABLEREAD只在第一次进行普通SELECT操作前生成一个ReadView,之后的查询操作都重复使用这个ReadView就好了。
  至此MySQL事务就给大家讲完了,了解更多JAVA知识及资料可关注微信公众号老周扯IT

有关柳树的作文篇一:小柳树在荣昌城的护城河两边,种了许多柳树。那柳树高高的个子,长长的柳枝倒垂下来,有的甚至都碰着水面了。春天,长长的柳枝上钻出了一粒粒鹅黄色的嫩芽,就像小鸟的嘴……市场消息苹果(AAPL。US)聘请了在福特工作31年的资深员市场消息:苹果(AAPL。US)聘请了在福特工作31年的资深员工来加速其汽车项目。苹果(AAPL。US)公司简介:苹果公司从事设计、制造和销售智能手机、个人电脑、平板电脑……ZD19便携式免扣打包机适合哪些行业使用产品名称:一键式自动打包机产品品牌:KBQPACK产品商标:TNZC28429934D01T181222产品产地:深圳产品型号:ZD19产品颜色:……沿江公园作文沿江公园的江就是甬江,江的对面是北仑区,而江的这边就是我们镇海区,周边树木环绕,花草盛开,还真是个美景之乡呢!下面我们来看看沿江公园作文,欢迎阅读借鉴。沿江公园作文1我的……倒霉的一天ldquo;秋起爽临风凄,木门作曲终难眠。rdquo;,今天一大早,我带着朦胧的睡眼、浓浓的睡意,爬下那温暖舒适的床。没办法!谁叫那门这么亢奋呢!大清早的就在那ldquo;一展……2015年高考作文题预测及范文分享是一种美德阅读下面的材料,按照要求作文。(60分)黑暗中,一块石头见身边的一块钻石没有一点光泽,便嘲笑道:ldquo;我不知道平时人们为什么把你抬得那么高,把你视作宝贝。现在你跟我……初中描写城市夜景的优秀作文导语:皎洁的月光如水银般洒向人间,整个城市都沐浴在柔和又明净旳夜色中,那感觉舒服极了。下面是小编整理的一些关于夜的优秀作文,欢迎查阅。篇一:上海的夜景放暑假时,我从攀枝花……听见万物生长的声音作文800字季节随着时间的更迭,而不断的轮回着,眼看着,春天就已经悄然而至了。ldquo;人间四月芳菲尽,山寺桃花始盛开。rdquo;伴随着倒春寒的风呼啸而过的声音,立春已至,四月还……爱是什么比喻句有哪些1、恋爱就象,盗版总是比正版流行。2、恋爱是什么关于恋爱的十个形象比喻3、恋爱就象拥有两只手表,你总是无法说清,到底哪个时间更准?4、恋爱就像小偷,没有一天能……从未走远初三优秀作文常于题海中迷迷糊糊的醒悟过来,抬起头,发现那从未走远的故乡萦绕在脑中。站立于钢筋铁泥之中,突兀地发现了自己在人群中的迷惘。睁开睡眼惺忪的眼皮,尽是一片故土的幻影。终于,借……精选描写偶像的作文400字集锦9篇在日常的学习、工作、生活中,大家都写过作文,肯定对各类作文都很熟悉吧,作文是通过文字来表达一个主题意义的记叙方法。相信很多朋友都对写作文感到非常苦恼吧,以下是小编为大家收集的描……想念小学校园里的每一个角落作文是它(母校)给我的小学涯画上了一个完美的句号,是它给予我童年的美好记忆,是它让我在知识的海洋中遨游,是它让我懂得知足常乐如今,即将告别美丽的校园,心中总有一种依依不舍的感觉。……
汕头中考作文范文我真想作文中考已经拉开帷幕,小编整理了中考的作文范文,快来看看吧。今年中考作文题为半命题作文ldquo;我真想rdquo;,昨天下午5时语文考试完毕后,记者在飞厦中学门口抓拍到了一……氢燃料电池的催化剂2030年必须迈过去的坎【能源人都在看,点击右上角加关注】说到新能源汽车,很多投资者脑海里会跳出三个字电动车。其实新能源汽车的涵盖范围不止于电动汽车(BEV),还包括一个很重要的品类氢能源汽车(……法媒中国是我们未来的窗户《回声报》9月17日刊登题为《中国是我们未来的窗户》的文章,称西方曾长期认为中国数字企业都是抄袭硅谷,经常将他们称为中国的谷歌或亚马逊。但情况已经变了,中国创造了其它地方都不存……到底啥是比特币到目前为止,我还没发现谁把比特币和区块链说得很清楚,所以今天我想试试。为了更好理解比特币,先给大家介绍西太平洋上的一个小岛,它叫雅普岛,这个岛上的居民用石头当货币,不是什……落叶的轮回作文在平时的学习、工作或生活中,许多人都有过写作文的经历,对作文都不陌生吧,根据写作命题的特点,作文可以分为命题作文和非命题作文。那要怎么写好作文呢?以下是小编收集整理的落叶的轮回……比特币价值归零所面对的系统性风险系统性风险是衡量金融市场活动安全与否的重要指标,它的威力就像说你不行你就不行,哪怕前面九十九步都走对了,但最后一步走错了,也会全盘皆输。这种蝴蝶效应式坍塌会导致整个体系出……从苹果13系列手机发售看,原来我们一直在键盘爱国9月17日,苹果13系列手机在国内正式发售了,无论是正式发售,还是前几天的预售,异常火爆销售场面一度让官网都瘫痪了。那么为何苹果要放在9。18前一天正式发售,是真的巧合,还是他……果粉狂喜!iOS15正式版发布FaceTime通话功能来了【手机中国新闻】9月15日凌晨,苹果召开秋季新品发布会,推出了iPhone13系列等新品。除了新品外,iOS15也备受关注,发布会过后,苹果给开发者们推送了iOS15RC版本更……iOS15正式版来了,线上升级全面指南苹果公司在今年6月举办了WWDC21,并推出了iOS15系统,相信很多朋友都已经用上公测版,而正式版终于要来了!今日凌晨1点苹果终于推送了iOS15正式版。同时推送了wa……iOS15正式版新功能总整理25项必学重点功能一次看苹果今日正式推出iOS15和iPadOS15正式版更新,主要是针对iPhone、iPad与iPodtouch所推出,iOS15支援iPhone6s系列及新款机型,最新iOS15……屏下摄像头手机并不贵,8GB运存55W快充仅2498元,还有智能手机在实现全面屏的过程中,正面诞生了很多种设计,包括刘海屏,水滴屏,挖孔屏,升降屏等等,这些都是处于过渡期,而屏下摄像头技术在未来才是主流。目前市面上在售的屏下摄像头手机并……手机中的明星?这四款国产手机颜值最高,连直男都把握不住但是随着手机芯片由高通一家独大之外,台积电也能从中分一杯羹之外,再无其它选择,可惜了华为的海思麒麟芯片。既然芯片无法拉开差距,于是我们看见各家厂商纷纷开始从手机外观开始动手对手……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网