当前位置: 首页 > news >正文

MySQL事务管理及视图

1.MySQL事务管理

1.1什么是事务

事务是由一组 DML 语句组成的不可分割的逻辑单元。 在并发场景下,CURD 操作如果不加以控制,会出现超卖、一票多卖等数据不一致问题,这类似于多线程不加锁访问临界区资源导致的并发安全问题。 事务的核心价值是简化应用层编程模型,让开发者无需手动处理底层的异常、回滚与并发冲突。事务是为上层应用服务的,在 MySQL 中,只有 InnoDB 存储引擎支持事务

1.2事务的操作方式

事务一般有两种提交方式:1.自动提交、2.手动提交。在命令行模式中单条sql语句其实就是一个事务,因为默认情况下MySQL的提交方式是自动提交的,也可以设置为手动提交,通过set autocommit=0设置为禁止自动提交,为1则表示设置为自动提交。设置完成后再次执行单sql语句就不再是一个事务了,而是要等到你提交或者回滚后才算做一个完整的事务。

1.3事务的隔离级别

为了保证执行事务的时候尽可能不受干扰,就有了事务的隔离性。根据不同的隔离程度,又有了不同的隔离级别。MySQL 的隔离级别有:

  1. 读未提交
  2. 读已提交
  3. 可重复读
  4. 串行化

读未提交(Read Uncommitted): 隔离性最低,所有事务可以看到其他事务未提交的数据,相当于没有隔离。会产生脏读、不可重复读、幻读所有问题。读已提交(Read Committed): 大多数数据库(如 Oracle、PostgreSQL)的默认隔离级别。 一个事务只能看到其他事务已经提交的数据。 解决了脏读,但会出现不可重复读、幻读可重复读(Repeatable Read)MySQL InnoDB 默认隔离级别。 确保同一个事务执行过程中,多次读取结果一致。 解决了脏读、不可重复读。 在普通快照读下完全不会出现幻读; 只有在当前读(UPDATE/DELETE/SELECT FOR UPDATE)时,才可能出现幻行。 MySQL 通过间隙锁 + 临键锁(Next-Key Lock)基本解决了幻读问题。串行化(Serializable): 最高隔离级别,强制事务串行执行,完全避免所有并发问题。 但性能极低,生产环境几乎不用

1.4隔离级别的查询

在MySQL 5.0 ~ 5.6可以使用select @@global.tx_isolation;来查询全局隔离级别。通过select @@session.tx_isolation;来查询当前会话的隔离级别。在之后的版本就需要通过select @@transaction_isolation;来查询当前会话的隔离级别.

1.5数据库的并发

数据库的并发情况一共有三种:1.读-读:不存在任何问题,不需要并发控制。2.读-写:有线程安全问题,可能遇到脏读、幻读、不可重复读等问题。3.写-写:有线程安全问题,可能会存在跟新数据丢失问题。

1.5.1读-写

多版本并发控制(MVCC)是用来解决读 - 写冲突的无锁并发控制机制。在 InnoDB 存储引擎中,每一行数据都会默认存在三个隐藏字段

  1. DB_TRX_ID:6 字节,记录最后一次对该行执行插入 / 修改操作的事务 ID。
  2. DB_ROLL_PTR:7 字节,回滚指针,指向 undo log 中的上一个历史版本,用于构建版本链。
  3. DB_ROW_ID:6 字节,隐含的自增 ID(隐藏主键)。如果数据表没有显式主键,InnoDB 会使用该字段自动生成聚簇索引。

当我们执行 DML 语句修改一行数据时,原始数据不会被覆盖删除,而是会作为历史版本写入undo log。 新数据的DB_ROLL_PTR回滚指针会指向 undo log 中的旧版本,形成版本链。 如果执行回滚操作,InnoDB 会通过DB_ROLL_PTR找到历史版本,恢复数据。

这些历史版本数据不会永久保留,当没有任何事务需要访问该版本时,后台的purge 线程会自动清理无用的 undo log 日志。 undo log 是 InnoDB 专门用于存储数据历史版本的日志文件,是实现 MVCC 和事务回滚的核心。

1.6Read View

Read View 是 InnoDB 内部定义的结构体,核心作用是实现数据版本的可见性判定,仅在执行快照读时创建该对象。ReadView 包含四个核心字段,用于记录快照生成瞬间的事务状态:

  1. m_ids:集合类型,存储 ReadView 创建时刻,系统内所有处于 ** 活跃状态(已开启但未提交)** 的事务 ID。
  2. up_limit_id:低水位标识,取值为m_ids集合中最小的事务 ID。
  3. low_limit_id:高水位标识,取值为 ReadView 创建时,系统即将分配的下一个事务 ID,等价于当前全局最大事务 ID 加一。
  4. creator_trx_id:标识创建当前 ReadView 的所属事务 ID。

事务执行快照读时,会逐行遍历数据的版本链,将数据版本的DB_TRX_ID(修改该版本的事务 ID)与 ReadView 字段做比对,完整判定逻辑如下:

  1. DB_TRX_ID等于creator_trx_id,代表该数据版本由当前事务自身修改,版本可见;若DB_TRX_ID小于up_limit_id,代表修改该版本的事务在 ReadView 生成前已完成提交,版本可见
  2. DB_TRX_ID大于或等于low_limit_id,代表修改该版本的事务在 ReadView 创建之后才开启,版本不可见
  3. 若上述条件均不成立,则检查DB_TRX_ID是否存在于m_ids活跃事务集合中:若存在,说明对应事务未提交,版本不可见;若不存在,说明对应事务已提交,版本可见

1.7RR与RC的本质区别

RR 和 RC 的核心区别,完全在于 ReadView 的生成时机不同:

  1. RR(可重复读)事务中第一次执行快照读(普通 SELECT)时创建 ReadView, 后续整个事务生命周期内所有快照读都复用同一个 ReadView,不再新建。 因此事务全程看到的都是同一份事务快照,无法看到其他事务已提交的数据,实现可重复读。

  2. RC(读已提交)事务中每一次执行快照读(普通 SELECT)都会重新创建新的 ReadView。 每次创建都会重新采集当前最新的活跃事务列表, 导致m_idsup_limit_idlow_limit_id全部实时更新。 因此每次查询都能看到其他事务最新提交的数据,实现读已提交。

2.视图

2.1视图的基本使用

创建视图:create view 视图名 as select语句;创建视图的作用是将一些需要高频查询或者修改的部分,创建为一个类似子表的结构。视图的修改会影响原表,原表的修改也会影响视图。删除视图:drop view 视图名;

2.2视图的规则与限制

同一数据库内,视图与表、其他视图名称必须唯一,不允许出现重名。 数据库对视图创建数量没有强制限制,但若将复杂查询封装为视图,尤其多层嵌套使用时,会对查询性能造成负面影响。 视图不支持建立索引,也无法绑定触发器与设置字段默认值。 借助视图可以提升数据访问的安全性,用户使用视图前需要拥有对应的访问权限。视图定义语句中可以使用 ORDER BY 子句,倘若查询视图的 SELECT 语句中也包含 ORDER BY,视图内部的排序规则会被外层排序覆盖。 视图在使用场景中可以和物理表配合进行关联、联合等查询操作。

http://www.jsqmd.com/news/897056/

相关文章:

  • 第四章:Go语言大模型调用框架 - Eino (MCP调用示例)
  • LightGlue深度解析:5个技巧让你掌握极速视觉特征匹配技术
  • 如何在Android设备上高效运行Windows应用:Mobox终极跨平台解决方案指南
  • 银行信贷报告自动生成,Agent需要集成哪些数据?深度拆解企业级Agent多源异构数据集成架构
  • 呼伦贝尔黄金回收实测报告:亲测6家平台,福昌夏验货数据全公开 - 黄金上门回收
  • 6.Java多线程详解:Thread类、线程属性与start()方法深度解析
  • 广东东莞专业的自动包装机圆角冲刀厂家推荐 - 变量人生001
  • AI品牌命名决策框架(2024全球TOP 10生成式AI产品命名深度复盘)
  • 终极指南:如何让微信同时登录手机和平板?WeChatPad免费解决方案
  • 5分钟快速上手ESP32开发:从Arduino到物联网应用实战指南
  • 极化码List-Fast-SSC解码器的高效硬件排序架构设计
  • 使用双氧水(7.5%)制作PCB
  • Keil C51调试器兼容性问题解析与解决方案
  • 【ChatGPT播客内容策划黄金法则】:20年AI内容架构师亲授5步闭环工作流,92%新手72小时内产出爆款选题
  • 用DeepSeek搞定论文降重与降AI!5个实用提示词+降ai率软件,定稿前必看! - 殷念写论文
  • 金价高位|无锡黄金回收,拒绝鬼秤,实价回收 - 奢侈品回收测评
  • 图片水印怎么去除?这款去水印神器一定要码住!
  • 终极解密指南:3分钟免费解锁网易云NCM音乐,实现跨平台自由播放
  • 嵌入式CPU实时大气湍流校正:免配准NCC融合方案详解
  • 告别手动复制粘贴!Open-Multiple-URLs 让批量打开链接变得如此优雅
  • 测试ADS1244,增加参考电压以及输入信号滤波
  • 告别数字垃圾:AntiDupl.NET开源工具帮你智能清理重复图片
  • 文献阅读 260526-Sustained deoxygenation in global flowing waters under climate warming
  • 大同老旧黄金首饰金条回收靠谱门店甄选攻略:2026年5月六家品牌实测,全程无损检测、免费上门、零隐形扣费,这篇看完不踩坑 - 润富黄金珠宝行
  • 使用范围太有限?试试永辉超市卡回收方法! - 团团收购物卡回收
  • 将Hermes Agent无缝对接至Taotoken的配置要点详解
  • EmulatorJS版本策略深度解析:如何为你的复古游戏体验选择最佳版本
  • 如何免费获取微信视频号和抖音无水印视频?跨平台资源下载神器res-downloader完全指南
  • 3分钟搞定:无需扫描仪,用浏览器把PDF变成专业扫描件
  • 博德之门3脚本扩展器:5分钟掌握终极游戏自定义工具