mysql InnoDB的事务

news/2025/4/1 18:11:48/文章来源:https://www.cnblogs.com/MaC-Matthew/p/18801418

一、事务的概念

一组数据库操作要么全部成功,要么全部失败,目的是为了保证数据的最终一致性

二、事务的四大特性(ACID)

  • 原子性(Actomicity):当前事务的操作要么成功,要么失败,原子性是由undo log日志来保证
  • 一致性(Consistency):使用事务的最终目的,由业务代码正确逻辑保证
  • 隔离行(Isolation):在事务并发执行时,他们内部的操作不能互相干扰
  • 持久性(Durability):一旦提交了事务,它对数据库的改变就应该是永久性的。持久性是由redo log日志来保证

三、事务的隔离级别

InnoDB引擎中提供了四种隔离级别,级别越高事务的隔离行越好,但性能就越低,而隔离性是由mysql的各种锁以及MVCC机制来实现

  • READ UNCOMMITTED(读未提交):一个事务可以读到另一个事务未提交的数据。有脏读的可能
  • READ COMMITTED(读已提交):事务只能读取到已经提交的数据。有不可重复读的可能性
  • REPEATABLE READ(可重复读,MySQL 默认级别):在一个事务中多次读取同一条数据时,结果始终相同。有幻读读可能
  • SERIALIZABLE(可串行化):最严的隔离级别,事务完全串行执行。无上述问题

三、脏读、不可重复读、幻读都是什么?

  • ‌脏读:是指一个事务读取了另一个事务未提交的事务。
    例:开启事务修改id是1的数据,但不提交事务。再开一个事务查询id是1的数据,但是不提交事务。
set tx_isolation = 'read-uncommitted';
begin;
update test_tab set blance = blance + 500 where id =1;
commit ;
set tx_isolation = 'read-uncommitted';
begin ;
select * from test_tab where id = 1;
commit ;

在事务修改sql事务未提交的情况下,查询结果是更新后的数据。在修改未提交事务时,被另一个事务读去到结果,可见是错误。脏读也就是写的事务未提交时,被另一个事务读区到结果。

  • 不可重复读:不可重复读是指只能读去到已经提交了的事务。
    例:
    还原表中的数据,
set tx_isolation = 'read-committed';
begin;
update test_tab set blance = blance + 500 where id =1;
commit ;
set tx_isolation = 'read-committed';
begin ;
select * from test_tab where id = 1;
commit ;

执行步骤:
1、开启一个事务,在事务中更新数据,不提交事务。再开启一个事务,查询正在更新的那条数据,不提交事务。

2、步骤1更新数据的事务提交,再次查询那条数据,不提交事务。

3、步骤1更新语句再次执行,不提交事务。再次查询那条数据,不提交事务。

4、步骤3的更新事务提交。再次查询那条数据,不提交事务。

5、查询的事务提交。

查询的事务无论是否提交,读到的数据都是已经提交事务的数据。

  • 幻读:
    还是将数据还原,重新执行下边的sql
set tx_isolation = 'repeatable-read';
begin;
update test_tab set blance = blance + 500 where id =1;
commit ;
set tx_isolation = 'repeatable-read';
begin ;
select * from test_tab where id = 1;
select * from test_tab where id = 1;
commit ;select * from test_tab where id = 1;

步骤:
1、1、开启一个事务,在事务中更新数据,不提交事务。再开启一个事务,查询正在更新的那条数据,不提交事务。

2、2、步骤1更新数据的事务提交,再次查询那条数据,不提交事务。

3、步骤1更新语句再次执行,不提交事务。再次查询那条数据,不提交事务。

4、步骤3的更新事务提交。再次查询那条数据,不提交事务。

5、查询的事务提交,再次查询。

在一个事务里,只要读过了这条数据,后边再读这条数据都以第一次读到的这条数据为主。
那么如何解决这个问题呢?
第一个办法就是用更更高的隔离级别。
第二个办法用乐观锁机制,加上一个version字段,查询的时候将version字段查出来select 业务字段,version from table,更新的时候每次version字段+1 update table set 业务字段, version = version + 1 where version = 前边查出来的version值,知道影响行数大于0。
第三个办法可以使用数据库的悲观锁,如果字段设计到计算的时候,用业务字段 = 业务字段 + 数量,因为mysql的insert、update会有写锁,每次都会用数据库中的最新的数据进行操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/908433.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用 OpenAI Agents SDK 构建 MCP

1.概述 OpenAI Agents SDK 现已支持 MCP(模型上下文协议),这是 AI 互操作性的重大变革。这使开发人员能够高效地将 AI 模型连接到外部工具和数据源。本篇博客,笔者将指导使用 OpenAI Agents SDK 构建 MCP 服务器,以增强你的 AI 应用程序。 2.内容 2.1 什么是 MCP MCP 服务…

C语言打卡学习第11天(2025.3.30)(补发)

冒泡排序的一个学习。还了解了一个快速排序的“挖坑法”,能省变量位置,但挺难写的,挺有意思:把数组第一个元素放一个空作为一个标准值,第一个位置就空了出来,然后将第一个“暂时标准值”从最后一个数开始比较,后面小就放到第一个“坑”,然后“坑”又到后面了,再从前面…

C语言打卡学习第10天(2025.3.29)(补发)

指针和数组的学习,数组现在能做到基本掌握和简单运用,指针有些难,还是得练

FastAPI中的Pydantic密码验证机制与实现

title: FastAPI中的Pydantic密码验证机制与实现 date: 2025/03/31 00:04:51 updated: 2025/03/31 00:04:51 author: cmdragon excerpt: FastAPI 中通过 Pydantic 模型实现密码验证,采用分层机制确保高效与灵活扩展。验证流程包括基础类型检查、长度验证、复杂度验证和泄露检…

PicGo+Github图床配置

PicGo+Github图床配置 参考 PicGo指南 PicGo+Github图床配置配置 Github 图床 创建 Github 仓库登录 Github,新建一个公开(Public)或私有(Private)仓库 (我个人选择新建公开仓库) 用于存储图片,仓库名任意取,例如 image-host​,进入新建的仓库,点击 Create a codespac…

独立按键控制 LCD1602 显示不同的谚语

前言 今天我又学到了一句话 “好的开始是成功的一半” 英语就是 “Well Begun Is Half Done” 所以希望能够通过独立按键,来控制LCD1602显示不同的谚语 演示函数数组的使用 错误用法 void (*sayings)(void)[MAX_SAYING] = {attitude,well_begun};报错正确用法 void (*sayings[…

OpenEuler RISC-V 上跑bitcoin(实战版)

不久前刚在OpenEuler 24.09 RISC-V上部署了 bitcoin,不过还没跑起来,这次我打算在这个环境下面运行一些应用服务,体验一下 OERV 的开发感觉。编译出来的 bitcoin 主要有几个命令,bitcoin-cli、bitcoind、bitcoin-util、bitcoin-wallet、bitcoin-tx和test_bitcoin。bitcoind…

javawebDay3-Maven框架

1.添加依赖 eg<dependencies><dependency><groupId></groupId><artifactId></artifactId></dependency></dependencies>从外部导入jar包等无需手动添加依赖 2.集成度高,eclipse和intellIDEA都能使用,在不同的操作系统也可以使…

Five Hundred Miles

一百英里 是自由,是初出茅庐的憧憬。 二百英里 是快乐,是逃离故里的喜悦。 三百英里 是忧伤,是萦绕心间的挂念。 四百英里 是思恋,是莺歌燕舞的家乡。 五百英里 是乡愁,是一去不返的凄凉。

day8华为机试题库继续

HJ3思路1:冒泡排序思路2:哈希表HJ4public String substring(int beginIndex) public String substring(int beginIndex, int endIndex)