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

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

文章目录

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


一、事务的基本操作

1. 开启事务

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

  • 方式 1 :使用 START TRANSACTION

    sql 复制代码
    START TRANSACTION; -- 开始事务
  • 方式 2 :使用 BEGIN

    sql 复制代码
    BEGIN; -- 与 START TRANSACTION 等效
2. 执行事务内操作

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

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

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

sql 复制代码
COMMIT; -- 提交事务,数据写入磁盘
4. 回滚事务

取消事务内的所有操作:

sql 复制代码
ROLLBACK; -- 回滚事务,撤销未提交的修改

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

步骤 1:准备测试表和数据
sql 复制代码
-- 创建测试表
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:执行转账事务
sql 复制代码
-- 开启事务
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;
验证结果
sql 复制代码
SELECT * FROM accounts;
-- 结果:
-- user_id=1, balance=400.00
-- user_id=2, balance=100.00

三、自动提交模式

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

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

此时需手动执行 COMMIT 或 ROLLBACK。

3. 重新开启自动提交
sql 复制代码
SET autocommit = 1; -- 重新启用自动提交

四、完整示例(含回滚)

sql 复制代码
-- 关闭自动提交
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. 长事务风险:避免未及时提交的事务长时间持有锁,导致性能问题。

六、事务的典型应用场景

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

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

相关推荐
这个DBA有点耶1 小时前
信创场景下数据同步软件怎么选?对比开源CDC与原生闭环工具的结构性差异
数据库·mysql·架构
多客:duokelijie2 小时前
代练订单系统选型思路:跨品类游戏接入、订单分层管理、自动结算逻辑拆解!
数据库·mysql·微信小程序·前端框架·uni-app·php·持续部署
PingCAP2 小时前
平凯星辰上榜!2026 年胡润全球独角兽企业
数据库
PingCAP2 小时前
轨道交通 AFC 系统升级,平凯 Loop 把跨部门协同变成可追溯闭环
数据库
java_logo3 小时前
Docker 部署 CloudBeaver:轻松搭建网页数据库管理平台
数据库·docker·容器·数据库管理·dbeaver·轩辕镜像·cloudbeaver
李白客4 小时前
AI 数据库落地 NL2SQL:准确率卡在四成,问题在表注释不在模型
数据库
FluxDB4 小时前
FluxDB vs DBX vs DBeaver:GPUI、Tauri、Eclipse 三种技术栈实测
数据库·mysql
杨航 AI5 小时前
JEV的用法
java·前端·数据库
数据库小学妹5 小时前
MySQL分页结果不稳定:唯一键兜底与游标分页
数据库·mysql·dba
风翼靓崽5 小时前
mysql数据备份/恢复
数据库·mysql