幻读 改造业务

简介: 【8月更文挑战第6天】

幻读是没有办法通过业务改造来解决的。但是在业务层面上,幻读一般不会被认为是一个问题,原因有两点:一是你分不清是不是幻读。比如说你在事务 A 里面读到了一条数据,你判断不出来它是在事务 A 开始之前就插入的,还是在事务 A 开始之后,事务 B 才插入并且提交的。

二是事务提交往往意味着业务已经结束,所以读到一个已经提交的事务的数据,不会损害业务的正确性。也就是说,如果事务A在开始之后,事务B才插入数据并且提交,那么这个时候事务A完全可以认为事务B所在的整个业务已经结束了,所以读出来也没什么问题。

回答的关键词是改造业务

正常来说是不推荐使用可重复读的,因为在我们的业务环境下想不到有什么场景非得使用可重复读这个隔离级别。
之前在推动降低隔离级别的时候,其实重构过一些业务。这一类业务就是在一个事务里面发起了两个同样的查询,比如在UPDATE之后又立刻查询,这种查询还必须走主库,不然会有主从延迟的问题。
这种业务可以通过缓存第一次查询的数据来避免第二次查询。但是这种改造一般是避不开幻读的。不过在业务上幻读一般不是问题。一方面是业务层面上区分不出来是否是幻读。另外一方面,事务提交了往往代表业务已经结束,那么发生幻读了,业务依旧是正常的。比如说事务 A 读到了事务 B 新插入的数据,但是事务 B 本身已经提交了,那么事务 A 就认为事务 B 所在的业务已经完结了,那么读到了就读到了,并不会出什么问题。

兜底的手段是:指定隔离级别

万一不能改造业务,那么还有一个方法,就是直接在创建事务的时候指定隔离级别。我前面调整的都是数据库的默认隔离级别,实际上还可以在 Session 或者事务这两个维度上指定隔离级别。

目录
相关文章
|
Web App开发 Windows
Selenium Chrome浏览器版本与chromedriver驱动兼容版本对照表
Selenium Chrome浏览器版本与chromedriver驱动兼容版本对照表
2371 0
Selenium Chrome浏览器版本与chromedriver驱动兼容版本对照表
|
Web App开发 Ubuntu 安全
【已解决】ubuntu 16.04安装最新版本google chrome出错, 旧版本chrome浏览器安装流程
【已解决】ubuntu 16.04安装最新版本google chrome出错, 旧版本chrome浏览器安装流程
1815 2
|
8月前
|
人工智能 运维 监控
AI辅助的运维流程自动化:实现智能化管理的新篇章
AI辅助的运维流程自动化:实现智能化管理的新篇章
1334 22
|
8月前
|
并行计算 PyTorch 算法框架/工具
阿里云PAI-部署Qwen2-VL-72B
阿里云PAI-部署Qwen2-VL-72B踩坑实录
3563 1
|
人工智能 API Python
国内大模型调用实战
前面我们一览了国内主要大模型厂商的API价格,今天我们就来具体看下具体API的使用【6月更文挑战第3天】
632 0
|
JavaScript Java 测试技术
基于Java的百货中心供应链管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的百货中心供应链管理系统的设计与实现(源码+lw+部署文档+讲解等)
226 0
|
存储 SQL 关系型数据库
MySQL事务日志奥秘:undo log大揭秘,一文让你彻底解锁!
【8月更文挑战第24天】本文深入探讨了MySQL中undo log的关键作用及其在确保事务原子性和一致性方面的机制。MySQL通过记录事务前的数据状态,在需要时能回滚至初始状态。主要介绍InnoDB存储引擎下的undo log实现,包括undo segment和record的结构,而MyISAM则采用redo log保障持久性而非一致性。通过一个简单的SQL回滚示例,展示了undo log如何在实际操作中发挥作用,帮助读者更好地理解并运用MySQL事务管理功能。
713 0
|
Linux Go iOS开发
Go语言新手指南:正确使用GOPATH的步骤
Go语言新手指南:正确使用GOPATH的步骤
6330 0
|
关系型数据库 MySQL 应用服务中间件
使用docker搭建nacos集群
使用docker搭建nacos集群
1902 1
使用docker搭建nacos集群
|
JSON Kubernetes Go
IDEA使用Kubernetes插件编写YAML
IDEA使用Kubernetes插件编写YAML
446 0
IDEA使用Kubernetes插件编写YAML