Mysql原理(三)事务和锁

      在学习数据库相关的知识时总会听到脏读、幻读、不可重复读等导致每个事务读取的数据不一致而产生紊乱。
      1、脏读:当事务A正在访问数据并进行修改,但是没有事务提交,这时事务B也访问这个数据读到事务A未提交的数据
      2、幻读:事务A第一次查询表数据总和,事务B新增数据并提交,事务A第二次查询得到表数据总和前后不一致而产生一种幻觉。
      3、不可重复读:事务A查询了一条数据,事务B修改并提交,事务A在此读取的时候发现前后两次读取不一致,成为不可重复读。
      所以当多个事务同时执行会存在上述问题为了解决这种现象,mysql就有了隔离级别,但是隔离级别越彻底也会导致性能的问题所以需要找到平衡点。
      以下是Mysql采取了四种隔离级别
     1. 读未提交: 事务没提交,可被别的事务看到
     2. 读提交 (RR):事务提交才被别的事务看到
     3. 可重复读 (RC):事务在执行过程,看到的数据和事务启动时看到的数据一致。未提交事务时对其他事务不可见
     4.串行化:同一条记录,有读锁和写锁存在,当出现读写冲突存在,后访问的事务必须等前一个事物执行完成(事务的先后)
     Mysql默认的事务隔离级别是Repeated Read(RR),达到的效果读取到数据都是其他事务已经提交的,同一个事物相同的读取得到的结果一直,不会出现insert幻读。
      那么读提交和可串行化这种事务隔离级别到底是怎么实现的?
      InnoDB里每个事物其实都有唯一的 事务ID是在事务开始时向InnoDB的事务系统申请严格递增。每次事务更新数据,都会生成一个新版本数据,这样一条数据记录会有多个版本每个版本都有自己trx_id,通过数组进行维护,将已经提交的事务ID和未提交的事务ID进行区分来确定数据版本的可见性。 InnoDB则利用数据多版本特性达到了读写并发
      对于多事务写操作,mysql则采取先读后写操作(当前读) ,也就是说事务A先进行修改数据但未提交事务B进行修改数据,这个时候事务A其实对写操作进行加锁,事务B则进行等待,直到事务A释放事务B读到最新版本数据。
      那么读提交RR和可重复读RC又有什么区别呢?
      InnoDB的RR和RC在事务提交时都会创建一个视图,RC是在事务启动的时候进行创建之后事务内都是共用这个一致性视图的,RR则在每个sql执行开始的时候进行创建的。
      如果事务出现异常进行事务回滚,Mysql会做些什么?
     我们都知道Mysql在修改一条记录首先将数据在内存中进行更新,然后redolog进行记录并置为prepare状态,告知Mysql执行器执行完成调用commit接口,这时执行器生成操作日志在binlog里并写入磁盘,执行器最终告知redolog改成提交状态(Mysql的两阶段提交)完成整个操作。
     其实在事务执行时也会在undolog存放,如果事务发生回滚或异常可以利用undo日志,撤销未提交的事务对数据库产生的影响。
     为什么写日志落盘会产生写磁盘操作,为什么还这么快呢?
     其实Mysql会为binlog分配一块内存,每个线程都会维护,在事务执行开始的时候先将数据写入Mysql内存,然后把log在写入文件系统的page cache中,最终才将数据持久到磁盘里,整个事务完成后会清空binlog的cache。
     mysql事务提交(组提交)Mysql采取并行事务提交通过sync_binlog控制写缓存write和同步到磁盘中fsyn,当sync_binlog=0只写缓存,sync_binlog=1每次事务提交后都执行fsyn,sync_binlog=n :每次事务提交累积到N个事务后一起fsyn,常见将N设置为100-1000

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容