[MySQL]五.InnoDB事务

事务四大特性(ACID):

原子性:强调事务的不可分割。

一致性:事务的执行的前后数据的完整性保持一致。

隔离性:一个事务执行的过程中,不应该受到其他事务的干扰。

持久性:事务一旦结束,数据就持久到数据库。

事务隔离级别:

1.未提交读RU —— 最低级别只能保证不读取物理上损坏的数据 会出现脏读问题(直接读写磁盘)

2.已读提交RC —— 语句级 会出现不可重复读问题(查询磁盘 操作内存)

3.可重复读取RR —— 事务隔离级别 会出现幻读问题 mysq默认事务隔离级别(查内存 写内存)

4.序列化 —— 最高级别 事务级 可以解决所有问题 但是性能慢 在数据安全性很重要的时候使用(事务串行化 一个一个执行)

使用事务会出现得问题:

1.数据更新丢失:

既:两个事务或者多个事务并行得时候,因为事务隔离级别不够从而产生联级回滚 因为先行得事务报错导致后面并行得事务也出现报错而抛出异常回滚使后面得事务因为异常从而丢失了需要更新得数据。(级联回滚5.7以下版本)

出现隔离级别:除序列化以外的

解决方法:提高事务隔离级别或加排他锁解决

2.脏读:

既:两个事务或多个事务并行的时候其中一个事务读取到了其他事务已修改但是未提交的数据。

出现隔离级别:未提交读(RU)

解决方法:提高事务隔离级别或使用锁

3.不可重复读:

既:一个事务对同一行数据重复读取两次,但是却得到了不同的结果。例如,在两次读取的中途,有另外一个事务对该型数据进行了修改,并提交。

出现隔离级别:已读提交(RC)

解决方法:提高隔离级别或使用锁

4.幻读:

既:两个事务或者多个事务并行的时候,在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据(SQL不一定一样),或事务未读取到另外一个事务已提交的数据,但是却导致执行SQL不成功。

出现隔离级别:可重复读取(RR)

解决方法:提高隔离级别或使用锁

事务日志:

执行流程:

写操作 ——> database/table ——> 缓存数据(内存) ——> innodb_log_Buffer(日志缓存区) ——> Undo log/Redo log ——> 数据落盘

当我们开启事务执行一条sql语句对事务进行修改的时候,它会先将数据从磁盘读入内存,并更新内存中的缓存数据,然后生成一条重做日志写入重做日志缓存。当事务真正的进行提交的时候,MySQL会将重做日志缓存中的内容刷新到重做日志文件。再将内存中的数据更新到磁盘上。

注:事务的整个过程中MySQL的日志优先级会大于数据。

回滚日志 undo:

回滚日志中记录的是与你执行SQL相反的SQL语句,当你的事务遇到异常或错误等其他因素数据需要回滚的时候 MySQL就从回滚日志中记录执行相反操作的SQL语句从而让已执行的操作进行回滚,从而保证事务的原子性,MySQL中事务的回滚就是靠回滚日志(undo log)来实现恢复机制的。

注:系统发生崩溃、数据库进程直接被杀死后、当用户再次启动数据库进程时,还能够立刻通过查询回滚日志将之前未完成的事务进行回滚,这也就需要回滚日志必须先于数据持久化到磁盘上,这也是需要先写日志后写数据库的主要原因。

重做日志 redo:

MySQL 使用重做日志(redo log)实现事务的持久性,重做日志由两部分组成:一是内存中重做日志的缓存区,因为在内存中所以它是易丢失去的,二是磁盘中的重做日志,它是持久的。

注:若事务提交后 MySQL因为一些物理性原因,数据还没来得及写入磁盘那么在MySQL重启就会执行重做日志(redo log),来恢复数据。

注:当事务执行完成以后 MySQL就不会再执行回滚日志了。

在数据库中,这两种日志经常都是一起工作的,可以将它们整体看做一条事务日志,其中包含了事务的 ID、修改的行元素以及修改前后的值。

事务声明周期:

创建日志    =>    日志刷盘(ib_logfile)    =>    数据刷盘   =>    写KCP (ib_data)

事务在操作数据的时候,会先创建日志文件(文件标识即日志ID),然后在执行修改写入的时候从数据库中获取数据将数据更新到缓存区中,然后将修改写入之前的数据先记录到日志文件中,接着再去进行数据的操作,操作完成以后,当你执行commit提交的时候,这时候再次把操作后的数据写入到日志文件,然后才做数据更新的操作(数据刷盘)。最后再去做事务一致性的校验。

事务日志写入频率(innodb_flush_log_at_trx_commit 参数解析):

innodb_flush_log_at_trx_commit (mysql通过这个参数来设置写入日志时间 即日志刷新频率)

注:这个参数影响的是日志声明周期中的日志刷盘环节写入到redo log的时间频率

注:参数值:0/1/2

查看innodb_flush_log_at_trx_commit参数设置:

show variables like 'innodb_flush_log_at_trx_commit';

修改innodb_flush_log_at_trx_commit参数设置:

set @@global.innodb_flush_log_at_trx_commit = 0;   -- 0,1,2

0值:性能最好 但是数据安全性最差 若是服务器死机或者断电 就会丢失数据

1值:性能最差 但是保证数据安全性最高 只要提交就不会丢失数据

2值:性能折中 即安全性比参数1差 但是性能比1好一点 安全性比0好一点性能比 0差一点 也会出现数据丢失的情况

注:MySQL默认此参数的值设置是1,且此参数是针对全局的,若是单机运行的话则默认使用1,若是集群服务则可以在不是很重要的数据设置为0以提高性能。

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

推荐阅读更多精彩内容

  • 事务(Transaction)是数据库区别于文件系统的重要特性之一。 在文件系统中, 如果正在写文件, 但是操作系...
    好好学习Sun阅读 1,011评论 0 5
  • 一、事务概述 我们可以将事务理解为一组sql语句的集合。事务可以只包含一条sql,也可以包含多条sql,事务中所有...
    国球乒乓阅读 363评论 0 0
  • 7.1 认识事务7.1.1 概述事务可由一条非常简单的SQL语句组成,也可以由一组复杂的SQL语句组成。事务是访问...
    正在加载更多阅读 503评论 0 0
  • 或许人与人之间的关系,从第一眼开始,就决定了他们会成为朋友、恋人或是认识的人。 我也一直信奉这样的观点...
    云水轩儿阅读 93评论 0 1
  • 中国北方的夏夜,漫天的星星在眨眼,那是上个世纪80年代的夜空,劳作了一天的农村人都有在吃过晚饭后,在街边纳凉聊天的...
    宋月才河北阅读 324评论 0 2