事务没提交的数据查的出来吗?_“金三银四”面试官:说说事务的ACID,什么是脏读、幻读?...
一、事务
事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。--摘自百科
在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,什么是脏读、幻读?...相关推荐
- 事务没提交的数据查的出来吗?_品牛栏山,论分布式事务
上周末,我和一个在电商上市公司做开发的朋友一起喝酒聊天,他目前带一个研发团队,负责大系统中退货款相关的技术服务版块,混的挺不错,从一个初级程序员做到规模很大上市公司的技术负责人,一路过来也非常坎坷,刚 ...
- 金三银四——大数据/Java面试集锦
金三银四,无论今年你有无跳槽计划,这篇文章集锦都值得你反复研读,建议收藏. 下列文章链接请阅读:<金三银四--面试集锦> 高级大数据研发工程师面试题总结 海量大数据处理面试题和思路总结 大 ...
- 【建议收藏】刷完这9套Java面试题,2021金三银四跳槽面试30K没问题
前言 距离2021年只有8天了,同时呢,离过年也不远了,等过完年,会有大批小伙伴要换工作了吧,这里给大伙儿整理了一些常见的Java面试题,希望对大家能有所帮助! JAVA基础 一.JAVA中的几种基本 ...
- 金三银四没把握住,凉了...
大家好,前两天跟朋友感慨,今年的铜三铁四.裁员.疫情导致好多人都没拿到offer!现在互联网大厂终于迎来了应届生集中求职季. 对于想跳槽的软件测试人来说,绝对是个找工作的好时机.这时候,很多高薪技术岗 ...
- 给2021金三银四的程序员们-投简历100份,1份面试通知都没收到,哪里出了问题
与该岗位契合度 写好简历要重点把握住以下几个方面: 人职匹配.HR招聘.看简历的一个基本原则就是"人职"匹配,因此整个简历呈现出的你的知识.技能.能力等综合素质,要和个人应聘的职位 ...
- mysql悲观锁会有脏数据吗_一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离机制...
首先说一下数据库事务的四大特性 1 ACID 事务的四大特性是ACID(不是"酸"....) (1) A:原子性(Atomicity) 原子性指的是事务要么完全执行,要么完全不执行 ...
- mysql 中的脏读与幻读_一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离机制...
首先说一下数据库事务的四大特性 1 ACID 事务的四大特性是ACID(不是"酸"....) (1) A:原子性(Atomicity) 原子性指的是事务要么完全执行,要么完全不执行 ...
- mysql 可重复读 悲观锁_一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离机制...
首先说一下数据库事务的四大特性 1 ACID 事务的四大特性是ACID(不是"酸"....) (1) A:原子性(Atomicity) 原子性指的是事务要么完全执行,要么完全不执行 ...
- blob字段乱码怎么处理_金九银十,你准备好了吗?没点Python面试题干货怎么行?(一)...
职场人没有不知道:金三银四,金九银十 的说法儿吧,今天干货奉上,100个Python面试高频题目. 一. 遇到过得反爬虫策略以及解决方法? 1.通过headers反爬虫 2.基于用户行为的发爬虫:(同 ...
最新文章
- Ajax弹出漂亮可拖动的提示层(窗)效果
- 源码推荐:仿写映客直播 ,快速切换主题 ,星星评分控件,表格样式,可以横向移动的表格, 仿微信键盘-
- Aliyun LOG Java Producer 快速入门
- 伺服电机选型惯量比重要性
- C语言程序设计之十六进制显示
- Android -- 短信
- c#如何将子窗体显示到父窗体的容器(panel)控件中
- 存储过程mysql报错1271_mysqldump备份失败以及解决方法汇总
- mos 控制交流_电机控制器母线电容的设计选型
- Linux驱动开发必看详解神秘内核(完全转载)
- sql语句创建唯一索引
- 阿里Java研发工程师实习面经
- Java多线程下载并具断点续传功能JAR
- k1658停运到什么时候_商洛一小区电梯停运10余天,高层业主:我可太难啦
- python对二维数组统计某一行的去重计数_Python数据分析笔记——Numpy、Pandas库
- Android小项目合集(经典教程)包含十五个Android开发应用实例
- 【干货分享】大话团队的GIT分支策略进化史
- tftp服务器怎么开启linux,启动Linux下的TFTP服务器
- 高等数学(第七版)同济大学 总习题六 个人解答
- C#获取登录验证码图片
热门文章
- 八皇后问题python_python八皇后问题的解决方法
- ArcGIS斜坡单元工具箱
- arcgis在面内创建随机点
- 神经网络与深度学习——TensorFlow2.0实战(笔记)(六)(Matplotlib绘图基础<折线图和柱状图>python)
- 【转】ABP源码分析四十七:ABP中的异常处理
- 【转】异步编程:.NET 4.5 基于任务的异步编程模型(TAP)
- [你必须知道的.NET]第三十四回,object成员,不见了!
- [你必须知道的.NET]第二十六回:认识元数据和IL(下)
- 第二次尝试修复Hbase2出现Region不一致,使用 HBCK2 - 2021.11.15
- linux怎么检测文件完整性,Linux如何基于AIDE检测文件系统完整性