什么是事务、事务的四个特性ACID、不考虑隔离性会导致的三个问题、四种隔离级别

  • 1 什么是事务
  • 2 事务的四大特性ACID
    • 2.1 原子性
    • 2.2 一致性
    • 2.3 隔离性
    • 2.4 持久性
  • 3 不考虑隔离性会产生的三个问题
    • 3.1 脏读
    • 3.2 不可重复读
    • 3.3 幻读(虚读)
  • 4 解决办法:四种隔离级别
    • 4.1 Read Uncommitted(读取未提交内容)
    • 4.2 Read Committed(读取提交内容)
    • 4.3 Repeatable Read(重复读)
    • 4.4 Serializable(可串行化)
  • 5 注意
  • 参考资料

1 什么是事务

事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所做的所有更改都会被撤销。可以理解为:更新数据库中各种数据项的程序执行单元。

同一根绳子上的蚂蚱,要活一起活,要死一起死。

MySQL事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,若删除一个人员,既要删除人员的基本资料,也要删除和该人员相关的信息,如信箱和文章等等,这些数据库操作语句构成一个事务。

  • 在MySQL中,只有使用了Innodb数据库引擎的数据库或表才支持事务。
  • 事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行
  • 事务用来管理insert,update,delete语句

在MySQL命令行的默认设置下,事务都是自动提交的,即执行SQL语句后就会马上执行COMMIT操作。因此要显式地开启一个事务,必须使用命令BEGIN或者START TRANSACTION,或者执行命令SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。

2 事务的四大特性ACID

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

2.1 原子性

一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节,事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有被执行过一样。

一组操作要么都发生,要么都不发生。

2.2 一致性

在事务开始之前和事务结束之后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定地工作。

事务的执行结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统运行中发生故障,有些事务尚未完成就被中断,这些未完成的事务对数据库所做的修改有一部分已经写入物理数据库,这时数据库就处于一种不正确的状态,或者说不一致的状态。

2.3 隔离性

数据库允许多个并发事务,同时对数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时,由于交叉执行而导致数据的不一致。事务隔离分为不同的级别,包括读未提交(Read uncommitted)、读提交(Read committed)、可重复读(repeatable read)和串行化(Serializable)。

一个事务的执行不能受其他事务的干扰。即一个事务内部的操作及使用的数据,对其他并发事务是隔离的,并发的各个事务之间不能互相干扰。

2.4 持久性

事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

一个事务一旦提交,对数据库中的数据的改变就应该是永久性的,接下来的其他操作或故障不应该对其执行结果有任何影响。

3 不考虑隔离性会产生的三个问题

3.1 脏读

脏读是指在一个事务处理过程中,读取了另一个未提交的事务中的数据。

3.2 不可重复读

一个事务两次读取同一行的数据,结果得到不同状态的结果,中间正好另一个事务更新了该数据,两次结果相异,不可被信任。通俗的讲就是:事务T1在读取某一个数据,而事务T2立马修改了这个数据,并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发生了不可重复读。

3.3 幻读(虚读)

一个事务执行两次查询,第二次结果集包含了第一次中没有或某些行已经被删除的数据,造成两次结果不一致,只是另一个事务在这两次查询中间插入或删除了数据造成的。

通俗来讲就是:例如,事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”,并且提交给数据库,而操作事务T1的用户,如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就发生了幻读。

4 解决办法:四种隔离级别

4.1 Read Uncommitted(读取未提交内容)

读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据。但是,读未提交产生了脏读,采用读提交可以解决脏读问题

4.2 Read Committed(读取提交内容)

读提交,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。读提交,若有事务对数据进行更新(UPDATE)操作时,读操作事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。但在这个事例中,出现了一个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读。但是,读提交两次查询会产生不同的查询结果,就会造成不可重复读问题,采用重复读可以解决此问题。

4.3 Repeatable Read(重复读)

重复读,就是在开始读取数据(事务开启)时,不再允许修改操作。重复读可以解决不可重复读问题。应该明白的一点就是,不可重复读对应的是修改,即UPDATE操作。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。采用Serializable可以解决幻读问题

4.4 Serializable(可串行化)

Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

5 注意

1、大多数数据库默认的事务隔离级别是Read committed,比如Sql Server , Oracle。Mysql的默认隔离级别是Repeatable read。

2、隔离级别的设置只对当前链接有效。对于使用MySQL命令窗口而言,一个窗口就相当于一个链接,当前窗口设置的隔离级别只对当前窗口中的事务有效;对于JDBC操作数据库来说,一个Connection对象相当于一个链接,而对于Connection对象设置的隔离级别只对该Connection对象有效,与其他链接Connection对象无关。

3、设置数据库的隔离级别一定要是在开启事务之前。

参考资料

  1. https://www.runoob.com/mysql/mysql-transaction.html
  2. https://blog.csdn.net/cd546566850/article/details/103988719

什么是事务、事务的四个特性ACID、不考虑隔离性会导致的三个问题、四种隔离级别相关推荐

  1. 事务的四个特性-ACID

    事务的四个特性-ACID 事务是恢复和并发控制的基本单位. 事务是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可翻个的工作单位 一个转账必须A账号扣钱成功,B账号加 ...

  2. 传统数据库支持四个特性 ACID

    传统数据库支持4个特性:原子性.隔离性.一致性.持久性. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: 1 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部 ...

  3. 华为畅玩5A 移动增强版cam-tl00四步走 一步BL解锁 二步刷recovery 三步root 四步安装框架Xposed

    荣耀5A解bl锁教程 https://cn.club.vmall.com/thread-26655260-1-1.html 荣耀5A 移动/双4G TWRP3.0.2 一键ROOT  https:// ...

  4. mysql事务四个特性_事务的四个特性

    事务的四个特性 在工作中,经常会接触到事务这个概念.涉及到事务,大家首先想到的就是事务的四个特性:ACID.抽空总结和梳理了一下事务的这四个特性. 1.原子性(Atomicity) 1.1什么是原子性 ...

  5. mysql事务四个特性_关系型数据库mysql事务四大特性

    关系型数据库mysql 事务四大特性 一.首先我们先说一下什么是事务 在mysql中对数据进行增删改查中的任何一次操作的过程都可以被认为是一次事务,事务是一系列严密的操作,事务的结束有两种结果,当事务 ...

  6. 事务的四个特性以及应用

    事务 一.事务的四个特性 ACID 1.1 事务 ​ 定义:所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位. 1.2 ACID ​ ACID,是指在可靠数据库 ...

  7. 事务四大特性之——隔离性

    事务四大特性之--隔离性 四大特性 一.4种隔离级别 二.案例 2.1 模拟业务需求 2.2 解决方案 且夫孝始于事亲,中于事君,终于立身. 孝的初始境界是侍奉自己的双亲,中层境界是侍奉自己的国君,最 ...

  8. 李雷和韩梅梅的一次转账事务–事务系统概述

    上次我们在最后一部分,给出了一个事务操作的模型和内部简单实现的方式,以期让大家能针对事务有一个比较简单的印象.今天,我就尝试针对事务的基本特性做一个简单的概述.当然,因为仍然是概述,所以不会特别深入的 ...

  9. mysql 事务 返回插入的值_深入理解mysql事务:事务机制的实现原理

    作者:logan 出自:SegmentFault 思否 一.事物的四个特性(ACID) 原子性(Atomicity):操作这些指令时,要么全部执行成功,要么全部不执行.只要其中一个指令执行失败,所有的 ...

最新文章

  1. 直接拿来用!最火的iOS开源项目
  2. Android - 已安装了存在签名冲突的同名数据包,解决方法!
  3. 微软一站式示例代码库 7月新代码示例发布
  4. Ribbon为什么要加入点对点直连的功能?如何操作?两句话玩转!
  5. 关于java数组拷贝的性能
  6. Python—实训day3—简单的在线翻译程序
  7. 《游戏大师Chris Crawford谈互动叙事》一22.1 互动叙事前途无量
  8. python入侵数据库数据库_一个简单的Python访问Mysql数据库例子
  9. js在ie追加html,如何使用JavaScript将属性添加/更新到HTML元素?
  10. surfaceflinger类图
  11. Motion 5 for Mac(视频后期特效处理软件)
  12. linux命令文本模式上网,Linux文本模式下上网简单命令
  13. react-color颜色选择器
  14. 微信小程序把view居中_微信小程序view居中
  15. 2019年8月15日奇虎360测评与笔试分享
  16. 数字游戏(number)
  17. LLVM中的pass及其管理机制
  18. 三星s8html查看器,拆解三星S8手机
  19. 2.6_11 Redis主从复制、哨兵模式、分片集群
  20. ionic 服务器消息推送,Ionic3 本地消息推送

热门文章

  1. JVM-Java程序性能监控-初级篇
  2. 在Ubuntu下搭建FTP服务器的方法
  3. java 22 - 8 多线程之线程生命周期图解
  4. Android WebRTC视频旋转问题
  5. sicily vector有序插入
  6. recovery v1跟recovery v2的区别
  7. java 获取 邮箱联系人_在android中读取联系人信息的程序,包括读取联系人姓名、手机号码和邮箱...
  8. linux 内核维护,Linux 4.18内核系列生命周期结束:用户需尽快更新内核
  9. label美化css,表单label美化代码
  10. c语言中0xde 这怎么用,为什么使用0x61c88647