世界今热点:一个事务插入,另外一个事务更新操作,是否会更新成功?
(相关资料图)
同样另外一个非常有意思的题目,值得我们思考。大概背景是这个样子的。如果有一个事务A进行插入 id > 100, 同时另外一个事务B进行更新update id > 100。那么事务B是否会更新成功。我们来画一个时序图:
time | 事务A | 事务B | 备注 |
---|---|---|---|
T1 | insert id > 100 set status = 1 | ||
T2 | update id > 100 set status = 2 | ||
T3 | 最后id > 100 status是为1 还是为2呢 |
我们从事务的四个隔离性来分别讨论这个问题。所有代码如下,仅仅是隔离性级别修改。修改是status状态。以下所有操作类似于打开两个浏览器,首先请求事务A,事务A执行过程中,在请求事务B,观察结果。
事务A 进行插入@RequestMapping("/test/publish/submit")public String testPublish1() {log.info("start...");transactionTemplate.execute(new TransactionCallback() {@Overridepublic String doInTransaction(TransactionStatus status) {for (long i = 1000; i < 3000; i++) {TElement element = new TElement();element.setfElementId(i);element.setfElementName("111");element.setfElementStatus((byte) 1);mapper.insertSelective(element);}return "OK";}});log.info("end...");return "ok";}
事务B 进行更新@RequestMapping("/test/publish/submit2")public String testPublish2() {log.info("start...");transactionTemplate.execute(new TransactionCallback() {@Overridepublic String doInTransaction(TransactionStatus status) {// @Update({"UPDATE t_element SET f_element_status=#{status} WHERE f_element_id > #{elementId}"})mapper.update(1000L, (byte) 2);return "OK";}});log.info("end...");return "ok";}
2.1读未提交(READ UNCOMMITTED)级别经过以上步骤测试,我们得出了如下日志
[INFO 2023-04-13 11:39:29.941] [http-nio-8099-exec-2] [df9c9572-a906-4f5c-91a2-c1fb4a87adcf] - [TransactionInsertUpdateTest.java.testPublishInsert:36] [start...][INFO 2023-04-13 11:39:31.708] [http-nio-8099-exec-3] [5651390e-f3be-4d35-81dc-cc7bb0062f40] - [TransactionInsertUpdateTest.java.testPublishUpdate:57] [start...][INFO 2023-04-13 11:39:31.760] [http-nio-8099-exec-3] [5651390e-f3be-4d35-81dc-cc7bb0062f40] - [TransactionInsertUpdateTest.java.testPublishUpdate:66] [end...][INFO 2023-04-13 11:39:42.952] [http-nio-8099-exec-2] [df9c9572-a906-4f5c-91a2-c1fb4a87adcf] - [TransactionInsertUpdateTest.java.testPublishInsert:50] [end...]
我们可以看到事务A在29秒开始执行,并且在42秒执行完成。事务B在31秒开始执行,并且没有阻塞,立刻执行完成。我们再来观察以下数据库中的数据,我们发觉status=1,也就是事务B没有更新成功因此在READ UNCOMMITTED下,事务会有问题。
2.2读已提交(READ COMMITTED)经过以上步骤测试,我们得出了如下日志。我们可以看到在RC级别下,出现了和READ UNCOMMITTED同样的现象。具体原因如上,就是没有加锁。
[INFO 2023-04-13 11:46:59.684] [http-nio-8099-exec-3] [a11f29f2-0658-42b4-8eba-28b5f94f9037] - [TransactionInsertUpdateTest.java.testPublishInsert:36] [start...][INFO 2023-04-13 11:47:01.029] [http-nio-8099-exec-2] [a9d04f6e-4efe-4ed7-a2df-c2454d8d7946] - [TransactionInsertUpdateTest.java.testPublishUpdate:57] [start...][INFO 2023-04-13 11:47:01.090] [http-nio-8099-exec-2] [a9d04f6e-4efe-4ed7-a2df-c2454d8d7946] - [TransactionInsertUpdateTest.java.testPublishUpdate:66] [end...][INFO 2023-04-13 11:47:12.574] [http-nio-8099-exec-3] [a11f29f2-0658-42b4-8eba-28b5f94f9037] - [TransactionInsertUpdateTest.java.testPublishInsert:50] [end...]
2.3可重复读(REPEATABLE READ)经过以上步骤测试,我们得出了如下日志。注意以下testPublishUpdate日志和以上日志的不同。
[INFO 2023-04-13 11:50:47.428] [http-nio-8099-exec-3] [83cac49b-f44e-44bd-a8ef-9d60714016f6] - [TransactionInsertUpdateTest.java.testPublishInsert:36] [start...][INFO 2023-04-13 11:50:48.851] [http-nio-8099-exec-2] [f66d62af-aa3f-4d3e-9f66-c97307d6e38e] - [TransactionInsertUpdateTest.java.testPublishUpdate:57] [start...][INFO 2023-04-13 11:50:53.872] [http-nio-8099-exec-3] [83cac49b-f44e-44bd-a8ef-9d60714016f6] - [TransactionInsertUpdateTest.java.testPublishInsert:50] [end...][INFO 2023-04-13 11:50:53.895] [http-nio-8099-exec-2] [f66d62af-aa3f-4d3e-9f66-c97307d6e38e] - [TransactionInsertUpdateTest.java.testPublishUpdate:66] [end...]
在事务A insert的时候,事务B update的时候阻塞了。这时候其实是间隙锁发挥了作用,也就是必须等事务A执行完毕之后,事务B才会获取锁,去update更新。那这时候就会更新成功了。数据库数据如下:
2.4序列化隔离级别最严格的级别。同2.3会阻塞然后更新成功。
3.结论在隔离级别为 读未提交(READ UNCOMMITTED)以及读已提交(READ COMMITTED)情况下,会出现事务更新失败的情况。本质上就是没有加锁导致的,而在RR级别,给事务A加上了间隙锁,事务B必须等待才能update成功。是用了锁的的方式来解决的,但可能存在效率的问题。所以锁尽量细化,比如行锁 > 间隙锁 > 记录锁 > 表锁。都是平衡效率以及安全的一种手段。
关键词:
- 广州科技活动周进入预热 明日正式启动300多场主题活动接踵而来
- 深化重点领域信用建设 广州正式出台新型监管机制实施方案
- 女童不慎掉入20米深井 18岁小姨三次下井成功营救
- 西安3个区域12月28日起每日开展全员核酸 官方提倡民众居家健身
- 浙江乐清一核酸检测结果异常人员 复采复检为阴性
- 浙江本轮疫情报告确诊病例490例 提倡“双节”非必要不出省
- 西安警方通报6起涉疫违法案件
- 西安新一轮核酸筛查日检测能力达160万管
- 西安市累计报告本土确诊病例811例
- 重庆曝光4起违反中央八项规定精神典型问题 警示党员干部清新过节
-
环球要闻:怎样提高精子浓度 提高精子浓度的方法
1、食补:为了提高精子浓度,可以在饮食中补充一些对精子有益的物质,如维生素A、维生素B、维生素E和维生素
-
全球视点!阿拉提是什么意思啊 alt是什么的缩写
今天来聊聊关于阿拉提是什么意思啊,alt是什么的缩写的文章,现在就为大家来简单介绍下阿拉提是什么意思啊
-
笔记本电脑键盘失灵一键修复win10_笔记本电脑键盘失灵一键修复
1、笔记本电脑键盘失灵一键修复的步骤:工具 原料:笔记本电脑,360安全卫士首先我们进入到浏览器搜索“360
-
通讯!互动| 联特科技:800G光模块产品已给多个客户送样并测试中
联特科技在互动平台表示,公司的光模块产品包括SFP+、QSFP+、QSFP28、QSFP-DD、OSFP等各种规格,涵盖速率从
-
精选!苹果铅笔替代品罗技的蜡笔创下35美元的历史新低
罗技的苹果铅笔替代品蜡笔跌至仅35美元。ApplePencil是苹果最好的iPad创新之一。它是一款“智能”手写笔,
-
小米13 Ultra样片公布,三颗镜头参数出来了
4月12日消息,小米13Ultra正式定档4月18日,小米表示,小米13Ultra是小米徕卡联手打造的又一历史级作品,是小米影像战略升级「第二章」。小米1
-
福厦高铁全线轨道精调完成
据新华社报导,当日,在福厦高铁莆田站新建站场,作业人员与大型养路机械共同配合,对最后900米有砟轨道精细调整结束,标志着福厦高铁全线轨道
-
端午节粽子的几种做法 天天热闻
鲜果粽子原料:枣泥、栗子、葡萄干、白糯米。做法:栗子和葡萄干切成粒,与枣泥混合成馅。白糯米泡在冷水里三四个小时,然后按照一层米、一层
-
男方之前有一个孩子,二婚后又生一个孩子,离婚孩子可能判给谁
男方之前有一个孩子,二婚后又生一个孩子,离婚孩子可能判给谁
-
@“消博会”,河北发出一份“廊洽会”请柬_天天资讯
河北省招商推介会暨2023中国·廊坊国际经济贸易洽谈会路演现场。长城网·冀云客户端记者胡晓梅摄4月11日上午,河北省招商推介会暨2023中国·廊
X 关闭
世界今热点:一个事务插入,另外一个事务更新操作,是否会更新成功?
天天新消息丨文旅部:“5·19中国旅游日”主会场活动将在云南腾冲举办
张伟:培养国际化人才,离不开对我国传统文化的吸收_环球快播
全球简讯:Lemon8或将5月正式在北美市场推出
X 关闭
焦点讯息:水发燃气董秘回复:根据《上海证券交易所股票上市规则》的规定
西安警方完成研考安保工作 共出动警力逾1.3万人次
得知西安疫情防控“升级” 男子夜骑共享单车回咸阳淳化
中国医生将任SIU主席背后:从追随者同行者到引领者
海南省通报政法队伍教育整顿成果