事务的四大特性(ACID):

1.原子性(atomicity):一个事务必须视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。

2.一致性(consistency):数据库总数从一个一致性的状态转换到另一个一致性的状态,比如无论a给b怎么转账或b转a,两个人最后的金额加起来==没转账前的总金额。

3.隔离性(isolation):一个事务所做的修改在最终提交以前,对其他事务是不可见的。

4.持久性(durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失,因为数据已经保存在硬盘中了。

mysql事务隔离级别有4个级别:

数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事务的并发操作中可能会出现脏读,不可重复读,幻读。下面通过事例一一阐述它们的概念与联系。

1.Read uncommitted

读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据。

----------------------------------------------------------------------------------------------------------------------------

mysql数据库表准备工作,创建表并初始化数据:

create table account(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `balance` int NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`)
);

insert into account values(1,1000);
insert into account values(2,1000);

insert into account values(3,1000);
insert into account values(4,1000);

----------------------------------------------------------------------------------------------------------------------------

例子:

set session transaction isolation level Repeatable read;// 设置mysql的事务隔离级别为Read uncommitted

select @@transaction_isolation;// 查看当前事务隔离级别(检查是否设置成功)

set @@autocommit=0; // 把mysql的自动提交设置为false

start transaction;// 开启一个事务

注:这里打开两个终端来测试,分别代表一个事务,左右各一个。

把上面的语句按顺序在两个终端各执行一遍后可以看到两个事务的隔离级别都是读未提交。

1.分别在两个事务中查看表的数据,如图:

2.在右边终端执行update account a set a.balance=a.balance - 200 where a.id=1,再次查看两个终端的表数据,如图:

这就是脏读,读未提交隔离级别什么都防止不了。此时如果右终端回滚事务,那么之前update也就相当于没执行,而左终端读取了update后的数据去进行了一些业务操作,那么后果将是很严重的。因为读取数据是不准确的。

举个栗子:

老板要给程序员发工资,程序员的工资是3.6万/月。但是发工资时老板不小心按错了数字,按成3.9万/月,但是事务还没有提交,就在这时,程序员去查看自己这个月的工资,发现比往常多了3千元,以为涨工资了非常高兴。但是老板及时发现了不对,马上回滚差点就提交了的事务,将数字改成3.6万再提交。

分析:实际程序员这个月的工资还是3.6万,但是程序员看到的是3.9万。他看到的是老板还没提交事务时的数据。这就是脏读。
----------------------------------------------------------------------------------------------------------------------------

如何解决脏读的发生?----->Read committed 读已提交

读提交,顾名思义,就是一个事务要等另一个事务提交后才能读取它的数据,否则是读取不到另外一个事务的更改的。

1.将数据库中的事务隔离级别修改为Read committed,并左右终端都开启事务(可参考上面的语句),查询表数据,效果如图:

2.在右边终端执行update account a set a.balance=a.balance - 200 where a.id=1,再次查看两个终端的表数据,如图:

虽然读已提交解决了脏读的问题,又发生了问题:

比如左终端事务id为1的用户去超市消费了800,在刷卡结账的时候查询卡里有1000元,就在这时,右终端事务也就是用户的女朋友,把卡里的钱全部转到了她自己的支付宝上,并提交了事务,然后用户输入密码扣款,收银员告诉用户说卡里没有钱了(这是用户脑子在想:“刚刚刷的时候我还看到有1000的啊,怎么突然就没了”,这个时候用户的电话响了,打给他的是他女朋友跟他说“我要用钱买点东西就把你卡里的钱提到我支付宝上了”)这时候用户才缓过神来,不然以为见鬼了呢!

用实际行动来证明上面的问题是存在的:

(用户女朋友)假设右终端是用户的女朋友,把钱提到支付账号金额为200(执行的语句就是第二步的sql),并提交执行commit

(用户自己)执行扣款,扣款金额是900,执行sql:update account set balance = balance-900 where id =1

假设超市的扣款系统会再次去查询用户的金额,判断是否足够再进行扣款那么就将导致扣款失败,因为被女朋友取走200只剩800了。如果没有二次查询用户的金额那么数据库表中id为1的用户的金额就是-100了,在现实中是不允许的。强行扣款后的数据如图:

这就是读已提交,若有事务对数据进行更新操作时,读操作事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。但在这个事例中,出现了一个事务范围内两个相同(刷卡时查询和扣款时再次查询)的查询却返回了不同数据,这就是不可重复读。

----------------------------------------------------------------------------------------------------------------------------

那么如何解决不可重复读?----->Repeatable read 可重复读

可重复读,就是在开始读取数据(事务开启)时,不再允许修改操作(insert/delete操作除外,这会出现一个新问题(幻读)下面会讲到)

比如用户在刷卡时开启了事务,这时用户的女朋友就无法进行转账(update操作),这样就防止了钱被用户女朋友转走的可能也就不会发生扣款失败了。

1.将数据库中的事务隔离级别修改为Repeatable read,并左终端先扣1000元,先不提交,再右终端扣1000此时被阻塞了,因为左终端还未提交。效果如图:

2.当左终端提交时,右终端才能执行(可以看到左终端先执行的update,而右终端再次执行就阻塞了,谁阻塞就说明前面有人比它先update操作具体的用户,比如这两个update都是id1)

重复读可以解决不可重复读问题。写到这里,应该明白的一点就是,不可重复读对应的是修改,即UPDATE操作。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。

幻读:比如左终端开启了一个事务要把所有用户的信息打印,第一次查看的数据是只有4个用户,如下图:

而在此时,右终端新增了一个用户,并提交了事务,这个时候左终端再打印出来,就发现多了一个用户(点击打印的时候左终端已经把刚刚的事务提交了重新执行了一次select(不管此次有无事务),不然是看不到右终端新增的用户的)。如下图:

这个时候左终端就会发现难道我见鬼了????(可重复度(update操作)和幻读(insert/delete操作)很像),那么如何解决这种在页面上显示的数据(开启了一个事务执行select)和打印的数据(又执行了一次select不管有无事务)不一致的情况呢?

Serializable 序列化 就是解决幻读问题的,可重复读是行级锁,而Serializable是表级锁,把整张表锁住了。

把数据库隔离级别设置未Serializable 再次执行重复度发生的问题,执行效果如图:

这样就防止了打印和看到的结果不一致情况。

总结:Read uncommitted读未提交(什么都不能保障导致脏读)

        

Read committed 读已提交(可以解决脏读但会导致不可重复读)

Repeatable read 可重复读(可以解决不可重复读但会导致幻读)

Serializable 序列化 就是解决幻读问题的,可重复读是行级锁,而Serializable是表级锁。

mysql默认的事务隔离级别是Repeatable read 可重复读。Serializable很少用到,因为这会严重影响性能。

转载于:https://www.cnblogs.com/ExMan/p/10274374.html

mysql的事务隔离级别相关推荐

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

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

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

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

  3. mysql 默认事务隔离级别_MySQL 事务隔离级别详解

    个人公众号『码农札记』,欢迎关注,查看更多精彩文章. 简介: MySQL的事务隔离级别一共有四个,分别是读未提交.读已提交.可重复读以及可串行化. 四个特性ACID 原子性 (Atomicity) 事 ...

  4. mysql 默认事务隔离级别_一文读懂MySQL的事务隔离级别及MVCC机制

    回顾前文: <一文学会MySQL的explain工具> <一文读懂MySQL的索引结构及查询优化> (同时再次强调,这几篇关于MySQL的探究都是基于5.7版本,相关总结与结论 ...

  5. 概述MySQL数据库---事务隔离级别

    同一个应用程序中的多个事务或不同应用程序中的多个事务在同一个数据集上并发执行时, 可能会出现许多意外的问题,事务并发处理可能引起的问题可分为如下三种类型: 脏读(Drity Read): 已知有两个事 ...

  6. 一文详解Mysql锁事务隔离级别

    一.锁的定义 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除了传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供需要用户共 享的资源.如何保证数据并发访问的一致 ...

  7. mysql数据库事务隔离级别演示

    mysql数据库事务隔离级别演示 关键词: 一.基本概念 二.事务的四个特性(ACID) 三.事务的用法 3.1 相关命令 3.2 使用步骤 四.数据库的隔离级别 五.示例演示(每组事务结束手动com ...

  8. 利用mysql的预编译机制_SQL注入笔记记录+MySQL的事务隔离级别

    (一)SQL注入. 1.如何理解SQL注入? SQL注入是一种将SQL代码添加到输入参数中,传递到SQL服务器解析并执行的一种攻击手法. 2.SQL注入是如何产生的? web开发人员无法保证所有的输入 ...

  9. mysql 默认事务隔离级别_上个厕所的功夫,搞懂MySQL事务隔离级别

    "隔离级别" 出于MySQL四大特性(ACID)中的"I",也就是隔离性.目的是实现数据.事务一致性"C". MySQL在多线程并发场景下, ...

最新文章

  1. 智能经济的动力,从人工智能到超级智能
  2. MYSQL 双主搭建
  3. 【推荐】让你事半功倍的交互体验自查清单
  4. 史上最全Java面试266题:算法+缓存+TCP+JVM+搜索+分布式+数据库
  5. MySql Workbench 安全模式(safe mode)
  6. 挖矿为什么要用显卡_Conflux显卡挖矿收益很高吗?挖矿指南与核算手册
  7. 软件工程 - 版本管理 - git 的基本实用方法 - 添加一个完整的项目目录的命令的细微差别
  8. ios 团购信息客户端demo(二)
  9. ArcView GIS 应用与开发技术(5)-统计图
  10. Ubuntu18.04+openv-2.4.9
  11. 什么是面向接口编程?
  12. Beego 使用redigo连接redis
  13. Win7下装centos7
  14. 2021-2027全球与中国镀铬钢管市场现状及未来发展趋势
  15. 区块链要去中心化么?
  16. 苹果发布黄色版 iPhone 14,定价 5999 元起;大神李沐被曝离职投身大模型创业;Atlassian 裁员 |极客头条...
  17. Fatal error: Cannot use 'Object' as class name as it is reserved in xxx/Object.php on line 77
  18. 大数据学习路线(完整详细版)
  19. 评估回归模型的指标:MSE、RMSE、MAE、R2、偏差和方差
  20. 四、PL/SQL程序控制语句

热门文章

  1. .NET配置文件的原因、位置和方式
  2. Microsoft Edge 83 稳定版发布
  3. 计算机课程中lnA怎么打,《计算机基础》考试模拟题(含答案)
  4. pssh Oracle,服务器批量执行工具 PSSH
  5. mysql数据库加载太慢_使用MySQL数据库很慢
  6. 小程序table 表格+小程序table 表格太长显示不全,实现滚动效果
  7. linux动态可执行文件,Linux中ELF格式 可执行文件+动态链接器 的加载
  8. idea控制台中文乱码问题
  9. php 百度收录api_帝国cms百度普通收录资源提交API推送php实例方法
  10. 2 怎么用vite_在国内怎么玩steam服帝国时代2决定版?用斧牛加速器