跟韩学AiOps系列之2025学MySQL系列_如何在MySQL中开启和提交事务?!

跟韩学AiOps系列之2025学MySQL系列_如何在MySQL中开启和提交事务?!

文章目录

      • 一、事务的基本操作
        • 1. 开启事务
        • 2. 执行事务内操作
        • 3. 提交事务
        • 4. 回滚事务
      • 二、验证示例(适用于 MySQL 5.7)
        • 步骤 1:准备测试表和数据
        • 步骤 2:执行转账事务
        • 验证结果
      • 三、自动提交模式
        • 1. 查看当前自动提交状态
        • 2. 关闭自动提交
        • 3. 重新开启自动提交
      • 四、完整示例(含回滚)
      • 五、关键注意事项
      • 六、事务的典型应用场景

在 MySQL 中,事务的开启和提交是保证数据一致性的核心操作。以下是清晰的操作步骤和示例:


一、事务的基本操作

1. 开启事务

有两种方式显式开启事务:

  • 方式 1:使用 START TRANSACTION
    START TRANSACTION; -- 开始事务
    
  • 方式 2:使用 BEGIN
    BEGIN; -- 与 START TRANSACTION 等效
    
2. 执行事务内操作

在事务内可以执行任意 SQL 操作(DML语句):

UPDATE accounts SET balance = balance - 100 WHERE user_id = 1; -- 扣款
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2; -- 收款
SELECT * FROM accounts; -- 查询数据状态(此时数据尚未持久化)
3. 提交事务

将事务内的所有操作永久生效:

COMMIT; -- 提交事务,数据写入磁盘
4. 回滚事务

取消事务内的所有操作:

ROLLBACK; -- 回滚事务,撤销未提交的修改

二、验证示例(适用于 MySQL 5.7)

步骤 1:准备测试表和数据
-- 创建测试表
CREATE TABLE accounts (user_id INT PRIMARY KEY,balance DECIMAL(10,2)
) ENGINE=InnoDB; -- 必须使用 InnoDB 引擎-- 插入测试数据
INSERT INTO accounts (user_id, balance) VALUES
(1, 500.00),
(2, 0.00);
步骤 2:执行转账事务
-- 开启事务
START TRANSACTION;-- 从用户1扣款100元
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;-- 向用户2收款100元
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;-- 提交事务(只有提交后数据才持久化)
COMMIT;
验证结果
SELECT * FROM accounts;
-- 结果:
-- user_id=1, balance=400.00
-- user_id=2, balance=100.00

三、自动提交模式

MySQL 默认启用自动提交(每条 SQL 单独作为一个事务):

1. 查看当前自动提交状态
SELECT @@autocommit; -- 返回 1 表示启用,0 表示禁用
2. 关闭自动提交
SET autocommit = 0; -- 关闭自动提交

此时需手动执行 COMMITROLLBACK

3. 重新开启自动提交
SET autocommit = 1; -- 重新启用自动提交

四、完整示例(含回滚)

-- 关闭自动提交
SET autocommit = 0;-- 开启事务(可选,BEGIN 也可)
START TRANSACTION;-- 用户1尝试扣款200元
UPDATE accounts SET balance = balance - 200 WHERE user_id = 1;-- 发现余额不足(假设余额不能为负),主动回滚
ROLLBACK; -- 所有修改撤销-- 重新开启自动提交
SET autocommit = 1;

五、关键注意事项

  1. 存储引擎:只有 InnoDB 支持事务(MyISAM 不支持)。
  2. 隔离级别:事务的可见性由隔离级别控制(默认 REPEATABLE READ)。
  3. 锁机制:事务中的操作可能隐式或显式加锁(如 SELECT ... FOR UPDATE)。
  4. 长事务风险:避免未及时提交的事务长时间持有锁,导致性能问题。

六、事务的典型应用场景

  • 转账操作:扣款和收款需原子性保证。
  • 订单创建:创建订单与扣减库存要一致。
  • 批量数据处理:确保批量操作的完整性。

通过合理使用事务,可以确保复杂操作的数据一致性!

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

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

相关文章

Java生成微信小程序码及小程序短链接

使用wx-java-miniapp-spring-boot-starter 生成微信小程序码及小程序短链接 在pom.xml文件中引入依赖 <dependency><groupId>com.github.binarywang</groupId><artifactId>wx-java-miniapp-spring-boot-starter</artifactId><version>4.7…

如何让通义千问大模型支持结构化输出?

之前的文章提到通义千问API无法通过with_structured_output/json schema的方式支持结构化输出&#xff0c;如果就是想使用通义千问大模型做结构化输出&#xff0c;应该怎么办呢&#xff1f;有两种办法 使用Ollama来运行通义千问大模型 从Ollama博客文章 Structured output 中…

一条 SQL 查询语句是如何执行的(MySQL)

第一讲&#xff1a;一条 SQL 查询语句是如何执行的 总览图示 MySQL 查询的执行流程可以大致分为以下步骤&#xff08;如图所示&#xff09;&#xff1a; 连接器&#xff08;Connection&#xff09;查询缓存&#xff08;Query Cache&#xff0c;MySQL 8.0 已废弃&#xff09;…

汽车OTA在线升级法规分析

摘要 本文介绍了R156法规即《关于批准车辆的软件升级和软件升级管理体系统一规定的法规》、该法规专注于汽车软件升级功能&#xff0c;并为此提出了一系列具体要求&#xff0c;旨在确保软件升级流程的安全性、可控性和合规性&#xff0c;从而顺应汽车行业智能化、联网化的发展趋…

Notepad编辑器实现换行符替换

在不同的Note编辑器中&#xff0c;批量把换行替换为空的方法有所不同&#xff0c;以下是常见编辑器的操作方法&#xff1a; Notepad 打开文件后&#xff0c;按CtrlH打开“查找和替换”对话框&#xff0c;在“查找”字段中输入\r\n&#xff0c;在“替换为”字段中输入一个空格…

Rust多线程性能优化:打破Arc+锁的瓶颈,效率提升10倍

一、引言 在 Rust 开发中&#xff0c;多线程编程是提升程序性能的重要手段。Arc&#xff08;原子引用计数&#xff09;和锁的组合是实现多线程数据共享的常见方式。然而&#xff0c;很多程序员在使用 Arc 和锁时会遇到性能瓶颈&#xff0c;导致程序运行效率低下。本文将深入剖…

【安装指南】Centos7 在 Docker 上安装 RabbitMQ4.0.x

目录 前置知识:RabbitMQ 的介绍 一、单机安装 RabbitMQ 4.0.7版本 1.1 在线拉取镜像 二、延迟插件的安装 2.1 安装延迟插件 步骤一:下载延迟插件 步骤二:将延迟插件放到插件目录 步骤三:启动延迟插件 步骤四:重启 RabbitMQ 服务 步骤五:验收成果 步骤六:手动…

【quantity】5 derive_more库 2.0 版介绍

derive_more 是一个 Rust 过程宏库&#xff0c;旨在通过派生宏自动生成常见 trait 的实现&#xff0c;减少样板代码。2.0 版本带来了多项改进和新特性。 主要特性 1. 支持的 Trait 派生 derive_more 2.0 支持派生以下 trait&#xff1a; 基本操作 trait: Display - 格式化显…

网站备份,网站数据备份的步骤

网站备份&#xff08;尤其是网站数据备份&#xff09;是保障业务连续性、防止数据丢失和应对安全威胁的关键措施。以下是系统化的备份步骤和实施建议&#xff0c;涵盖技术操作、策略规划及常见问题处理&#xff1a; 一、备份前的准备工作 明确备份范围 核心数据&#xff1a;…

OpenCV 图形API(72)图像与通道拼接函数-----根据指定的方式翻转图像(GMat)函数 flip()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 翻转一个2D矩阵&#xff0c;围绕垂直轴、水平轴或同时围绕两个轴。 该函数以三种不同的方式之一翻转矩阵&#xff08;行和列的索引是从0开始的&a…

医生视角下转录组学的生物信息学分析

医生视角下转录组学的生物信息学分析 转录组学的生物信息学分析是医生解决临床与科研问题的有力工具。这里罗列医学转录组学相关的几个概念&#xff0c;从使用者&#xff08;医生&#xff09;的角度看待理解相关技术&#xff0c;为后续使用该技术说明临床和科研问题奠定基础。…

量子机器学习中的GPU加速实践:基于CUDA Quantum的混合编程模型探索

引言&#xff1a;量子机器学习的新范式 在量子计算与经典机器学习交叉融合的前沿领域&#xff0c;量子机器学习&#xff08;Quantum Machine Learning, QML&#xff09;正经历着革命性突破。然而&#xff0c;随着量子比特规模的增长和算法复杂度的提升&#xff0c;传统计算架构…

Matplotlib核心课程-2

4.1 数据加载、储存 4.1.1 从数据文件读取数据 导入支持库&#xff1a; import numpy as np from pandas import Series,DataFrame import pandas as pd 从csv文件读取数据&#xff0c;一般方法&#xff1a; pd.read_csv(../data/ex1.csv,encodinggbk) 从csv文件读取数据&#…

new和malloc的区别

1 语义层级不同&#xff1a;语言机制 vs. 库函数 new / new[] (C 关键字)malloc / calloc / realloc (C 运行时函数)本质语言级运算符&#xff1b;可被重载库函数&#xff1b;无法重载作用分配内存 并调用构造函数仅分配原始字节块&#xff0c;不做初始化&#xff0c;也不调用…

C++11新特性_自动类型推导_auto

在 C11 标准中&#xff0c;auto关键字被赋予了全新且强大的功能&#xff0c;它用于自动类型推导&#xff0c;即编译器能够根据变量的初始化表达式自动确定其类型。 基本语法 使用auto声明变量时&#xff0c;只需给出auto关键字&#xff0c;后面紧跟变量名&#xff0c;并对其进…

[预备知识]6. 优化理论(二)

优化理论 本章节介绍深度学习中的高级优化技术&#xff0c;包括学习率衰减、梯度裁剪和批量归一化。这些技术能够显著提升模型的训练效果和稳定性。 学习率衰减&#xff08;Learning Rate Decay&#xff09; 数学原理与可视化 学习率衰减策略的数学表达&#xff1a; 步进式…

【计算机视觉】语义分割:Mask2Former:统一分割框架的技术突破与实战指南

深度解析Mask2Former&#xff1a;统一分割框架的技术突破与实战指南 技术架构与创新设计核心设计理念关键技术组件 环境配置与安装指南硬件要求安装步骤预训练模型下载 实战全流程解析1. 数据准备2. 配置文件定制3. 训练流程4. 推理与可视化 核心技术深度解析1. 掩膜注意力机制…

数字智慧方案5857丨智慧机场解决方案与应用(53页PPT)(文末有下载方式)

资料解读&#xff1a;智慧机场解决方案与应用 详细资料请看本解读文章的最后内容。 随着科技的飞速发展&#xff0c;智慧机场的建设已成为现代机场发展的重要方向。智慧机场不仅提升了旅客的出行体验&#xff0c;还极大地提高了机场的运营效率。本文将详细解读沃土数字平台在…

【C到Java的深度跃迁:从指针到对象,从过程到生态】第五模块·生态征服篇 —— 第二十章 项目实战:从C系统到Java架构的蜕变

一、跨语言重构&#xff1a;用Java重写Redis核心模块 1.1 Redis的C语言基因解析 Redis 6.0源码核心结构&#xff1a; // redis.h typedef struct redisObject { unsigned type:4; // 数据类型&#xff08;String/List等&#xff09; unsigned encoding:4; // …

ES6异步编程中Promise与Proxy对象

Promise 对象 Promise对象用于解决Javascript中的地狱回调问题&#xff0c;有效的减少了程序回调的嵌套调用。 创建 如果要创建一个Promise对象&#xff0c;最简单的方法就是直接new一个。但是&#xff0c;如果深入学习&#xff0c;会发现使用Promise下的静态方法Promise.re…