一、事务

事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。--摘自百科

在MySQL里,事务是在引擎层面实现,比如MyIsam不支持,InnoDB支持

面试清单(Java岗):Java+JVM+数据库+算法+Spring+中间件+设计模式​shimo.im

二、ACID

提到事务,肯定会想到 ACID 是吧,自行感受一下概念,然后我们来讲讲隔离性的问题。

  • 原子性:事务的所有操作要么全部成功,要么全部回滚。
  • 一致性:总是从一个一致性的状态转换到另一个一致性的状态。
  • 隔离性:多个事务并发执行时,一个事务的执行不应影响其他事务的执行
  • 持久性:已被提交的事务对数据库的修改应该永久保存在数据库中。

三、隔离级别

做了多年的 CRUDer,对这几个词真是不陌生,要不是出去面试,也真不会去了解。希望大家看完之后,面试的时候,不要慌,跟他刚。

实际上,这些场景都是出现在多个事务同时执行时的场景。

3.1 脏读(Read Uncommitted)

通俗的讲,一个事务在处理过程中读取了另外一个事务未提交的数据。

你都还没提交,我就读到了你刚操作的数据,万一你回滚了怎么办,你说这脏不脏。

举例:

假设打赏的逻辑是:① 我的账户+1元;② 你的账户-1元。

当你执行到第一个步骤,我去查询我的账户已经是2元了,很开心!!!宣布请大家去撸串!!!但是最后扣款的时候发现你余额不足了,回滚了,我的1元没了,就很难受!!

3.2 不可重复读(Non-repeatable Read)

通俗的讲,一个事务范围内,多次查询某个数据,却得到不同的结果。

与脏读的区别:脏读是读到未提交的数据,而不可重复读读到的却是已经提交的数据,但实际上是违反了事务的一致性原则。

举例:

假设我查了下账户余额,看到你们给小编打赏了1块钱,很开心!!!宣布请大家去撸串!!!在付款之前,钱被另外一个人取走,又查询到没钱了,被留下来洗碗了!!!

因为我查询完后,这条数据没锁住,又被别的事务更新了,导致当前事务每次都是读到最新的数据。

3.3 幻读

在Repeatable Read隔离级别下,一个事务可能会遇到幻读(Phantom Read)的问题。

事务A读取与搜索条件相匹配的若干行。事务B以插入或删除行等方式来修改事务A的结果集,然后再提交。

举例:

看到了吗,在一个事务A中,第一次查询某条记录,是没有的,但是,当试图更新这条不存在的记录时,竟然能成功,并且,再次读取同一条记录,它就神奇地出现了。

实际上,在InnoDB引擎中,对于索引的扫描,不仅锁住扫描到的索引,而且还锁住这些索引覆盖的范围(gap),因此这个范围是内插入数据是不允许的。

四、mysql模拟事务隔离性测试

SELECT @@session.tx_isolation;
SELECT @@tx_isolation;  SET SESSION TRANSACTION ISOLATION LEVEL read uncommitted;
SET SESSION TRANSACTION ISOLATION LEVEL read committed;
SET SESSION TRANSACTION ISOLATION LEVEL repeatable read;
SET SESSION TRANSACTION ISOLATION LEVEL serializable;  start transaction;--建表
drop table AMOUNT;
CREATE TABLE `AMOUNT` (
`id`  varchar(10) NULL,
`money`  numeric NULL
)
;
--插入数据
insert into amount(id,money) values('A', 800);
insert into amount(id,money) values('B', 200);
insert into amount(id,money) values('C', 1000);
--测试可重复读,插入数据
insert into amount(id,money) values('D', 1000);--设置事务
SET SESSION TRANSACTION ISOLATION LEVEL read uncommitted;
SELECT @@tx_isolation;
--开启事务
start transaction;--脏读演示,读到其他事务未提交的数据
--案列1,事务一:A向B转200,事务二:查看B金额变化,事务一回滚事务
update amount set money = money - 200 where id = 'A';
update amount set money = money + 200 where id = 'B';--不可重复读演示,读到了其他事务提交的数据
--案列2,事务一:B向A转200,事务二:B向C转200转100
SET SESSION TRANSACTION ISOLATION LEVEL read committed;  --开启事务
start transaction;
--两个事务都查一下数据(转账之前需要,查一下金额是否够满足转账)
select * from amount;
--事务一:B向A转200
update amount set money = money - 200 where id = 'B';
update amount set money = money + 200 where id = 'A';commit;
--事务二:B向C转200转100
update amount set money = money - 100 where id = 'B';
update amount set money = money + 100 where id = 'C';
commit;
--从事务二的角度来看,读到了事务一提交事务的数据,导致金额出现负数--幻读演示
--案列3,事务一:B向A转200,事务二:B向C转200转100
SET SESSION TRANSACTION ISOLATION LEVEL repeatable read;  --开启事务
start transaction;
--两个事务都查一下数据(转账之前需要,查一下金额是否够满足转账)
select * from amount;
--事务一:B向A转200
update amount set money = money - 200 where id = 'B';
update amount set money = money + 200 where id = 'A';commit;
--事务二:B向C转200转100
update amount set money = money - 100 where id = 'B';
update amount set money = money + 100 where id = 'C';
commit;
--从事务二的角度来看,读到了事务一提交事务的数据,导致金额出现负数

作者:Java2B
原文链接:https://juejin.im/post/5e1417006fb9a047f3363c41

事务没提交的数据查的出来吗?_“金三银四”面试官:说说事务的ACID,什么是脏读、幻读?...相关推荐

  1. 事务没提交的数据查的出来吗?_品牛栏山,论分布式事务

    上周末,我和一个在电商上市公司做开发的朋友一起喝酒聊天,他目前带一个研发团队,负责大系统中退货款相关的技术服务版块,混的挺不错,从一个初级程序员做到规模很大上市公司的技术负责人,一路过来也非常坎坷,刚 ...

  2. 金三银四——大数据/Java面试集锦

    金三银四,无论今年你有无跳槽计划,这篇文章集锦都值得你反复研读,建议收藏. 下列文章链接请阅读:<金三银四--面试集锦> 高级大数据研发工程师面试题总结 海量大数据处理面试题和思路总结 大 ...

  3. 【建议收藏】刷完这9套Java面试题,2021金三银四跳槽面试30K没问题

    前言 距离2021年只有8天了,同时呢,离过年也不远了,等过完年,会有大批小伙伴要换工作了吧,这里给大伙儿整理了一些常见的Java面试题,希望对大家能有所帮助! JAVA基础 一.JAVA中的几种基本 ...

  4. 金三银四没把握住,凉了...

    大家好,前两天跟朋友感慨,今年的铜三铁四.裁员.疫情导致好多人都没拿到offer!现在互联网大厂终于迎来了应届生集中求职季. 对于想跳槽的软件测试人来说,绝对是个找工作的好时机.这时候,很多高薪技术岗 ...

  5. 给2021金三银四的程序员们-投简历100份,1份面试通知都没收到,哪里出了问题

    与该岗位契合度 写好简历要重点把握住以下几个方面: 人职匹配.HR招聘.看简历的一个基本原则就是"人职"匹配,因此整个简历呈现出的你的知识.技能.能力等综合素质,要和个人应聘的职位 ...

  6. mysql悲观锁会有脏数据吗_一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离机制...

    首先说一下数据库事务的四大特性 1 ACID 事务的四大特性是ACID(不是"酸"....) (1) A:原子性(Atomicity) 原子性指的是事务要么完全执行,要么完全不执行 ...

  7. mysql 中的脏读与幻读_一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离机制...

    首先说一下数据库事务的四大特性 1 ACID 事务的四大特性是ACID(不是"酸"....) (1) A:原子性(Atomicity) 原子性指的是事务要么完全执行,要么完全不执行 ...

  8. mysql 可重复读 悲观锁_一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离机制...

    首先说一下数据库事务的四大特性 1 ACID 事务的四大特性是ACID(不是"酸"....) (1) A:原子性(Atomicity) 原子性指的是事务要么完全执行,要么完全不执行 ...

  9. blob字段乱码怎么处理_金九银十,你准备好了吗?没点Python面试题干货怎么行?(一)...

    职场人没有不知道:金三银四,金九银十 的说法儿吧,今天干货奉上,100个Python面试高频题目. 一. 遇到过得反爬虫策略以及解决方法? 1.通过headers反爬虫 2.基于用户行为的发爬虫:(同 ...

最新文章

  1. Ajax弹出漂亮可拖动的提示层(窗)效果
  2. 源码推荐:仿写映客直播 ,快速切换主题 ,星星评分控件,表格样式,可以横向移动的表格, 仿微信键盘-
  3. Aliyun LOG Java Producer 快速入门
  4. 伺服电机选型惯量比重要性
  5. C语言程序设计之十六进制显示
  6. Android -- 短信
  7. c#如何将子窗体显示到父窗体的容器(panel)控件中
  8. 存储过程mysql报错1271_mysqldump备份失败以及解决方法汇总
  9. mos 控制交流_电机控制器母线电容的设计选型
  10. Linux驱动开发必看详解神秘内核(完全转载)
  11. sql语句创建唯一索引
  12. 阿里Java研发工程师实习面经
  13. Java多线程下载并具断点续传功能JAR
  14. k1658停运到什么时候_商洛一小区电梯停运10余天,高层业主:我可太难啦
  15. python对二维数组统计某一行的去重计数_Python数据分析笔记——Numpy、Pandas库
  16. Android小项目合集(经典教程)包含十五个Android开发应用实例
  17. 【干货分享】大话团队的GIT分支策略进化史
  18. tftp服务器怎么开启linux,启动Linux下的TFTP服务器
  19. 高等数学(第七版)同济大学 总习题六 个人解答
  20. C#获取登录验证码图片

热门文章

  1. 八皇后问题python_python八皇后问题的解决方法
  2. ArcGIS斜坡单元工具箱
  3. arcgis在面内创建随机点
  4. 神经网络与深度学习——TensorFlow2.0实战(笔记)(六)(Matplotlib绘图基础<折线图和柱状图>python)
  5. 【转】ABP源码分析四十七:ABP中的异常处理
  6. 【转】异步编程:.NET 4.5 基于任务的异步编程模型(TAP)
  7. [你必须知道的.NET]第三十四回,object成员,不见了!
  8. [你必须知道的.NET]第二十六回:认识元数据和IL(下)
  9. 第二次尝试修复Hbase2出现Region不一致,使用 HBCK2 - 2021.11.15
  10. linux怎么检测文件完整性,Linux如何基于AIDE检测文件系统完整性