一、事务的基本要素

  1、原子性:事务开始后的所有操作,要么全部做完,要么全部不做,不能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没发生一样。也就是说事务是一个不可分割的整体。

  2、一致性:事务开始前和开始后,数据库的完整性约束没有被破坏。A向B转钱,不能A扣钱B收不到钱。

  3、隔离性:同一时间,只允许一个事务请求同意数据,不同事务之间彼此没有任何干扰。比如A存钱的过程中,B不能取钱。

  4、持久性:事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

二、事物的并发问题

  1、脏读:事务A读取事务B更新的数据,然后B回滚操作,那么A读到的是脏数据。与数据库中不符。

  2、不可重复读:事务A多次读取同一数据,事务B在事务A多次读取过程中,对数据进行了更新并提交,导致事务A多次读取同一数据时,结果不一致。

  3、幻读:A在读取数据库中的是数据的时候将所有的具体数据改成ABCDE等级,如:99分改成A级,但是这个时候B突然插入一条具体的数据,A就发现还有一条没有改变过来,像是幻觉一样,叫做幻读。

  小结:不可重复读和幻读的区别就是,不可重复读侧重于修改提交,幻读侧重于增加和删除。解决不可重复的方法是只需锁住满足条件的行,幻读的解决办法是锁住所需要的表。

三、Mysql的事物的隔离级别

四、用例子说明各个隔离级别的情况

  1、读未提交:

    (1)打开一个客户端A,并设置当前事务模式为read uncommitted(未提交读),查询表account的初始值:

    (2)在客户端A的事务提交之前,打开另一个客户端B,更新表account:

    (3)这时,虽然客户端B的事务还没提交,但是客户端A就可以查询到B已经更新的数据:

    (4)一旦客户端B的事务因为某种原因回滚,所有的操作都将会被撤销,那客户端A查询到的数据其实就是脏数据:

    (5)在客户端A执行更新语句update account set balance = balance - 50 where id =1,lilei的balance没有变成350,居然是400,是不是很奇怪,数据不一致啊,如果你这么想就太天真 了,在应用程序中,我们会用400-50=350,并不知道其他会话回滚了,要想解决这个问题可以采用读已提交的隔离级别

  2、读已提交

    (1)打开一个客户端A,并设置当前事务模式为read committed(未提交读),查询表account的所有记录:

    (2)在客户端A的事务提交之前,打开另一个客户端B,更新表account:

    (3)这时,客户端B的事务还没提交,客户端A不能查询到B已经更新的数据,解决了脏读问题:

    (4)客户端B的事务提交

    (5)客户端A执行与上一步相同的查询,结果 与上一步不一致,即产生了不可重复读的问题

  3、可重复读

    (1)打开一个客户端A,并设置当前事务模式为repeatable read,查询表account的所有记录

    (2)在客户端A的事务提交之前,打开另一个客户端B,更新表account并提交

    (3)在客户端A查询表account的所有记录,与步骤(1)查询结果一致,没有出现不可重复读的问题

    (4)在客户端A,接着执行update balance = balance - 50 where id = 1,balance没有变成400-50=350,lilei的balance值用的是步骤(2)中的350来算的,所以是300,数据的一致性倒是没有被破坏。可重复读的隔离级别下使用了MVCC机制,select操作不会更新版本号,是快照读(历史版本);insert、update和delete会更新版本号,是当前读(当前版本)。

(5)重新打开客户端B,插入一条新数据后提交

(6)在客户端A查询表account的所有记录,没有 查出 新增数据,所以没有出现幻读

补充:

  1、事务隔离级别为读提交时,写数据只会锁住相应的行

  2、事务隔离级别为可重复读时,如果检索条件有索引(包括主键索引)的时候,默认加锁方式是next-key 锁;如果检索条件没有索引,更新数据时会锁住整张表。一个间隙被事务加了锁,其他事务是不能在这个间隙插入记录的,这样可以防止幻读。

  3、事务隔离级别为串行化时,读写数据都会锁住整张表

   4、隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。

  

转载于:https://www.cnblogs.com/a2534786642/p/11162865.html

13 Msql之四种事务隔离界别相关推荐

  1. mysql四种事务隔离级别

    mysql事务并发问题 ACID什么的就不啰嗦了.mysql多个事务并发的时候,可能会出现如下问题: 1. 更新丢失 即两个事务同时更新某一条数据,后执行的更新操作会覆盖先执行的更新操作,导致先执行的 ...

  2. mysql四种输入_mysql四种事务隔离级别

    mysql事务并发问题 ACID什么的就不啰嗦了.mysql多个事务并发的时候,可能会出现如下问题: 1. 更新丢失 即两个事务同时更新某一条数据,后执行的更新操作会覆盖先执行的更新操作,导致先执行的 ...

  3. Java面试题之Oracle 支持哪三种事务隔离级别

    Oracle 支持三种事务隔离级别: 1.读已提交:(默认) 2.串行化: 3.只读模式 转载于:https://www.cnblogs.com/hujinshui/p/10463883.html

  4. 【MySQL】MySQL的四种事务隔离级别

    [MySQL]MySQL的四种事务隔离级别 本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事 ...

  5. mysql holdlock_mysql事务隔离界别与锁机制

    数据库锁 共享锁(Shared lock) 例1: ---------------------------------------- T1: select * from table (请想象它需要执行 ...

  6. 数据库并发问题和事务隔离界别

    数据库并发问题和事务隔离界别 一.数据库的并发问题 1. 脏读 2. 不可重复读 3. 幻读 二.事务隔离界别 1. Read Uncommited:读未提交的数据 2. Read Commit:读已 ...

  7. Mysql有四种事务隔离级别,详解脏读、不可重复读、幻读

    Mysql的事务隔离级别 Mysql有四种事务隔离级别,这四种隔离级别代表当存在多个事务并发冲突时,可能出现的脏读.不可重复读.幻读的问题. 脏读 大家看一下,我们有两个事务,一个是 Transact ...

  8. InnoDB的几种事务隔离级别

    前文 首先理解事务的ACID的隔离性 并发带来的问题,脏读 .不可重复读 .幻读 的问题. 脏读: 一个事务读取了另一个事务未提交的数据,导致数据不一致.[事务2未提交] 不可重复读: 一个事务前后两 ...

  9. Spring 有几种事务隔离级别?

    Spring 中的事务隔离级别和数据库中的事务隔离级别稍有不同,以 MySQL 为例,MySQL 的 InnoDB 引擎中的事务隔离级别有 4 种,而 Spring 中却包含了 5 种事务隔离级别. ...

最新文章

  1. 使用 IntraWeb (15) - 基本控件之 TIWEdit、TIWMemo、TIWText
  2. inline-block什么意思中文_css中inline-block是什么?inline-block布局的使用
  3. 微信小程序(六) 文章详情静态页面detail
  4. mysql 5.3 build4.234_mysql版本3.23跟4.1区别
  5. Nhibernate.hbm2ddl.auto配置详解
  6. python数字1 3怎么表示_Python入门篇之数字
  7. webgis从基础到开发实践_开源WebGIS教程系列——11.1 GISLite 的开发背景与设计
  8. orm2 中文文档 3.3 模型钩子
  9. 说明Android应用调用全屏方式
  10. 五个最佳编程文本编辑器
  11. 从硅谷产品经理谈谈:AI产品经理要不要懂技术算法?
  12. silverlight 无法启动调试 数据无效
  13. python爬取歌曲教程_歌曲网站,教你爬取 mp3 和 lyric
  14. FS8205A低压20V N 沟道增强型 MOS 场效应管
  15. Android自定义底部带有动画的Dialog
  16. 联表查询求和的一些问题
  17. windows下进行嵌入式系统开发工程管理编译方案
  18. h5: canvas如何设置高度和宽度
  19. 7-242 母牛问题
  20. 硬盘、U盘起死回生的方法:文件系统显示为RAW文件系统,总共字节为0,可用字节为0且无法读取 的解决办法

热门文章

  1. 直面中国市场的新挑战,律商风险数据赋能车险智慧决策踏上新征程
  2. Task 06:FOR、IF以及while
  3. 第二章 基础数据 第2节 工作日历
  4. 2018百度秋招一面/二面/三面
  5. 前备 正点原子以及野火stm32资料获取
  6. Shell基础之自定义变量
  7. SQLServer中用户 'sa' 登录失败解决办法
  8. 数据库优化有哪些? 分别需要注意什么
  9. 洛谷T156530 儒略历详解
  10. 星际争霸2 微操练习 地图