文章目录

  • MySQL事务
    • #1 事务
    • #2 事务特性
    • #3 MySQL隔离
      • #3.1 为什么需要设置隔离?
        • #3.1.1 更新丢失(Lost update)
        • #3.1.2 脏读(Dirty Reads)
        • #3.1.3 不可重复读(Non-repeatable Reads)
        • #3.1.4 幻象读
      • #3.2 MySQL隔离级别?
        • #3.2.1 Read uncommitted(未授权读取、读未提交)
        • #3.2.2 Read committed(授权读取、读提交)
        • #3.2.3 Repeatable read(可重复读取)
        • #3.2.4 Serializable(序列化)

MySQL事务

#1 事务

事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。

#2 事务特性

一般来说,事务是必须满足4个条件(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。

  • 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
  • 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
  • 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
  • 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

#3 MySQL隔离

#3.1 为什么需要设置隔离?

在数据库操作中,在并发的情况下可能出现如下问题

  • 更新丢失(Lost update)
  • 脏读(Dirty Reads)
  • 不可重复读(Non-repeatable Reads)
  • 幻象读

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ctJR8NqQ-1583433950250)(https://raw.githubusercontent.com/Coxhuang/yosoro/master/20200303161559-image.png)]

#3.1.1 更新丢失(Lost update)

当两个事务选择同一行,然后更新数据,由于每个事务都不知道其他事务的存在,就会发生丢失更新的问题,(你我同时读取同一行数据,进行修改,你commit之后我也commit,那么我的结果将会覆盖掉你的结果)

事务A覆盖事务B已经提交的数据,造成事务B所做的操作丢失。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HXQ91e6L-1583433950252)(https://raw.githubusercontent.com/Coxhuang/yosoro/master/20200226164822-image.png)]

解决方法:对行加锁,只允许并发一个更新事务。

#3.1.2 脏读(Dirty Reads)

一个事务正在对一条记录做修改,在这个事务提交之前,别的事务读取到了这个事务修改之后的数据,也就是说,一个事务读取到了其他事务还没有提交的数据,就叫做脏读。

解决办法:如果在第一个事务提交前,任何其他事务不可读取其修改过的值,则可以避免该问题。

#3.1.3 不可重复读(Non-repeatable Reads)

不可重复读 就是一个事务读到另一个事务修改后并提交的数据(update)。在同一个事务中,对于同一组数据读取到的结果不一致。比如,事务B 在 事务A 提交前读到的结果,和在 事务A 提交后读到的结果可能不同。不可重复读出现的原因就是由于事务并发修改记录而导致的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QnnODucG-1583433950254)(https://raw.githubusercontent.com/Coxhuang/yosoro/master/20200226165445-image.png)]

解决办法:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题。

#3.1.4 幻象读

一个事务中,读取到了其他事务新增的数据,仿佛出现了幻象。(幻读与不可重复读类似,不可重复读是读到了其他事务update/delete的结果,幻读是读到了其他事务insert的结果)。例如:目前工资为1000的员工有10人。那么事务1中读取所有工资为1000的员工,得到了10条记录;这时事务2向员工表插入了一条员工记录,工资也为1000;那么事务1再次读取所有工资为1000的员工共读取到了11条记录。

解决办法:如果在操作事务完成数据处理之前,任何其他事务都不可以添加新数据,则可避免该问题

#3.2 MySQL隔离级别?

数据库事务的隔离级别有4个,由低到高依次为:

  • Read uncommitted(未授权读取、读未提交)
  • Read committed(授权读取、读提交)
  • Repeatable read(可重复读取)
  • Serializable(序列化)

这四个级别可以逐个解决脏读、不可重复读、幻象读这几类问题。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TItO3Trj-1583433950263)(https://raw.githubusercontent.com/Coxhuang/yosoro/master/20200303165736-image.png)]

#3.2.1 Read uncommitted(未授权读取、读未提交)

就是一个事务可以读取另一个未提交事务的数据。最低级别,它存在4个常见问题(脏读、不可重复读、幻读、丢失更新)。

#3.2.2 Read committed(授权读取、读提交)

就是一个事务要等另一个事务提交后才能读取数据。 它解决了脏读问题,存在3个常见问题(不可重复读、幻读、丢失更新)。

#3.2.3 Repeatable read(可重复读取)

MySQL默认隔离级别,在一个事务中,直到事务结束前,都可以反复读取到事务刚开始时看到的数据,并一直不会发生变化,避免了脏读、不可重复读现象,但是它还是无法解决幻读问题。 。它解决了脏读和不可重复读,还存在2个常见问题(幻读、丢失更新)。

#3.2.4 Serializable(序列化)

序列化,或串行化。就是将每个事务按一定的顺序去执行,它将隔离问题全部解决,但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

MySQL(一)---事务相关推荐

  1. mysql执行事务的语句_详解MySQL执行事务的语法和流程

    摘要:MySQL 提供了多种存储引擎来支持事务. MySQL 提供了多种存储引擎来支持事务.支持事务的存储引擎有 InnoDB 和 BDB,其中,InnoDB 存储引擎事务主要通过 UNDO 日志和 ...

  2. 简单介绍MySQL开启事务的两种方式

    本篇文章给大家分享MySQL 是如何开启一个事务的,原文通过两种方式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧 方式 1 START TRANSACTION 或 ...

  3. 【MySQL】MySQL的事务

    事务 目录 事务 1.1 为什么使用事务? 1.2 事务的概念 1.3 使用 2.事务的基本特性 2.1 脏读问题: 2.2 不可重复读: 2.3 幻读问题: 2.4 MySQL中事务的隔离级别 1. ...

  4. mysql+实例夯住的监控_Nagios 里面监控MySQL 监控事务夯住(RUNNING)报警通知

    序言: 业务报警订单提交异常,页面一直没有反应,排查后是事务没有提交或者回滚导致,想到如果及时监控事务的运行状态报警出来,那么就可以及时排查出问题所在,方便运营处理,所以自己就弄了一个shell脚本放 ...

  5. MySQL分布式事务(XA事务)

    MySQL分布式事务(XA事务) 官网:https://dev.mysql.com/doc/refman/5.7/en/xa.html 1.什么是分布式事务 分布式事务就是指事务的参与者.支持事务的服 ...

  6. Mysql:事务管理——未完待续

    逻辑事务管理    --基本上应用于innodb引擎 begin [work]    start transaction [with consistent snapshot] commit [work ...

  7. MySQL之事务隔离级别--转载

    转自:http://793404905.blog.51cto.com/6179428/1615550 本文通过实例展示MySQL事务的四种隔离级别. 1 概念阐述 1)Read Uncommitted ...

  8. 秒杀 mysql 事务_秒杀怎么样才可以防止超卖?基于mysql的事务和锁实现

    Reference:  http://blog.ruaby.com/?p=256 并发事务处理带来的问题? 相对于串行处理来说,并发事务处理能大大增加数据库资源的利用率,提高数据库系统的事务吞吐量,从 ...

  9. java 一个大事务下的新增、修改、查询_重新学习Mysql数据库8:MySQL的事务隔离级别实战...

    本文转自:https://blog.csdn.net/sinat_27143551/article/details/80876127 本系列文章将整理到我在GitHub上的<Java面试指南&g ...

  10. mysql中decimal不能为空吗_程序员,知道Mysql中事务ACID的原理吗?

    点击上方"linkoffer", 选择关注公众号高薪职位第一时间送达 引言 照例,我们先来一个场景~ 面试官:"知道事务的四大特性么?" 你:"懂,A ...

最新文章

  1. 【Windows】清除win10开始菜单中失效打程序标签
  2. c语言之贪吃蛇源码,C语言之贪吃蛇经典源码
  3. linux小波识别算法,人脸识别相关技术之小波变换
  4. 一种storyboard+swift实现页面跳转的方法
  5. LDAP 中 CN, OU, DC 的含义
  6. Redis源码:朴实无华且枯燥
  7. unittest-常见问题解决方案记录
  8. 跟angular2学一键开启项目--关于上个react-redux项目的一键调试
  9. Halcon11相对于Halcon10改动
  10. linq判断集合中相同元素个数_高中数学:集合与函数概念知识点汇总
  11. [转]Linux 基本操作(RM 删除)
  12. Cadence元件库介绍
  13. step7支持linux,STEP7 V5.4版本要求的操作系统-工业支持中心-西门子中国
  14. 使用 Pandas 与 Matplotlib 分析科比职业生涯数据-CSDN公开课-专题视频课程
  15. 将人力资源HR纳入OKR
  16. 偏差、误差、训练误差、测试误差
  17. 桌面ie图标删不掉的解决技巧
  18. D. Three Religions
  19. 【校园卡】更新联通校园卡套餐海报及常规操作,校园卡最新消息及选购建议,增加评论功能...
  20. 一个简单的B站视频抽奖小程序

热门文章

  1. 算法学习--回溯和剪枝
  2. 1086 就不告诉你 (15 分) (C语言)
  3. 谐振子的动力学学运动
  4. 读书笔记12.27 12.28 12.29(数据驱动状态监测)
  5. 基于systemgenerator的根号计算
  6. 卡方检验、T检验+F检验、方差分析、Z检验
  7. VSCode编码格式修改
  8. OAuth2 -GitHub授权登录超详细教程
  9. python爬取趣事百科文本笑话,另中间两个for能同时输出不解,请看到的朋友帮忙解答
  10. 编程题:寻找无限循环小数的循环节及长度