新闻中心

mysql如何回滚事务_mysql事务回滚操作方法

2025-12-03
浏览次数:
返回列表
使用ROLLBACK回滚事务需在START TRANSACTION后执行,配合S*EPOINT可实现部分回滚,存储过程结合DECLARE HANDLER能捕获异常并自动回滚,确保数据一致性。

mysql如何回滚事务_mysql事务回滚操作方法

MySQL中回滚事务的核心是使用 ROLLBACK 命令,前提是当前操作处于一个开启的事务中,并且存储引擎支持事务(如InnoDB)。

开启事务并执行回滚

在MySQL中,默认情况下每条语句是自动提交的(autocommit = 1)。要手动控制事务,必须先关闭自动提交或显式开始一个事务。

- 使用 START TRANSACTION 显式开启一个事务 - 执行一系列DML操作(INSERT、UPDATE、DELETE) - 如果发现错误或需要撤销操作,使用 ROLLBACK 回滚

示例:

START TRANSACTION;
<p>UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;</p><p>-- 发现转账异常,回滚操作
ROLLBACK;</p><p>-- 此时两条UPDATE都不会生效</p>

自动回滚与异常处理

MySQL本身不会自动判断业务逻辑错误进行回滚,但可以通过以下方式实现条件回滚:

- 在存储过程中结合 SIGNALGET DIAGNOSTICS 捕获异常 - 使用 DECLARE HANDLER 定义错误处理逻辑,触发ROLLBACK

示例(存储过程中的错误处理):

DELIMITER //
CREATE PROCEDURE transfer_money(
    IN from_user INT, 
    IN to_user INT, 
    IN amount DECIMAL(10,2)
)
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        ROLLBACK;
        RESIGNAL;
    END;
<pre class='brush:php;toolbar:false;'>START TRANSACTION;

UPDATE accounts SET balance = balance - amount WHERE user_id = from_user;
IF ROW_COUNT() = 0 THEN
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '源用户不存在或余额不足';
END IF;

UPDATE accounts SET balance = balance + amount WHERE user_id = to_user;
IF ROW_COUNT() = 0 THEN
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '目标用户不存在';
END IF;

COMMIT;

END// DELIMITER ;

保存点(S*EPOINT)用于部分回滚

如果只想回滚事务中的某一部分操作,可以使用 S*EPOINT 设置中间节点。

UXbot UXbot

AI产品设计工具

UXbot 185 查看详情 UXbot - 使用 S*EPOINT 保存点名 创建保存点 - 使用 ROLLBACK TO S*EPOINT 保存点名 回滚到指定位置 - 可选择继续操作或最终回滚整个事务

示例:

START TRANSACTION;
<p>INSERT INTO logs VALUES ('step1');</p><p>S*EPOINT before_update;</p><p>UPDATE accounts SET balance = balance - 50 WHERE user_id = 1;</p><p>-- 发现更新有问题,回滚到before_update
ROLLBACK TO S*EPOINT before_update;</p><p>-- 可以继续其他操作
INSERT INTO logs VALUES ('step2 corrected');</p><p>COMMIT;</p>

基本上就这些。关键在于确保使用支持事务的引擎,正确开启事务,并根据需要选择完整回滚或部分回滚。不复杂但容易忽略细节,比如autocommit设置和错误处理机制。

以上就是mysql如何回滚事务_mysql事务回滚操作方法的详细内容,更多请关注其它相关文章!


# 可以通过  # 淘宝茶店怎么做营销推广  # 深圳教育关键词排名查询  # 营销推广会宣传横幅  # 来宾网站优化软件下载  # seo推举 27火 星下拉  # 网站推广制作厂家排名  # 杭州新型网站建设平台  # 宁夏seo软件哪个便宜  # seo和其他推广哪个好  # 石家庄律师网站推广平台  # mysql  # 相关文章  # 操作步骤  # 过程中  # 全攻略  # 不存在  # 多个  # 操作方法  # 镜像  # 离线  # 事务回滚 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 一加Ace 6T支持全新明眸护眼:通过了最严苛的护眼小金标认证  铁路12306官网网页端快速入口 铁路12306官方首页登录教程  怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】  如何修改开机登录密码_Windows账户安全设置超详细教程【必学】  Win11怎么修改默认浏览器_Windows 11设置Chrome为默认  c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发  c++中的std::basic_string的SSO优化_c++短字符串优化深度解析  使用CSS更改登录屏幕输入框中PNG图标颜色的策略与局限性  漫蛙2漫画入口 漫蛙正版网页漫画直达网址  正确连接J*aScript到HTML实现可点击图片与自定义事件处理  Win11蓝牙耳机断连怎么解决 Win11蓝牙设置重新配对与驱动更新【技巧】  Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问  Fabric模组开发:自定义物品与物品组的现代管理方法  win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法  将HTML动态表格多行数据保存到Google Sheet的教程  微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法  C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言  fishbowl官网免费版 fishbowl养鱼网站入口  React列表渲染与独立状态管理:避免全局状态影响局部更新  PHP中SSG-WSG API的AES加密实践:正确使用初始化向量  苹果手机如何防止被恶意App追踪  处理Kafka消费者会话超时:深入理解消息处理语义与幂等性  sublime如何优雅地处理行尾空格_sublime自动清理多余空白字符配置  精准捕获:如何在页面中监听除特定元素外的所有点击事件  京东单号查询入口_京东快递订单追踪入口  MinIO大规模对象列表性能瓶颈深度解析与外部元数据管理策略  如何优雅地解决Livewire文件上传难题?SpatieLivewireFilepond让一切变得简单  J*aScript异步迭代器_j*ascript异步遍历  学习通在线学习平台 学习通网页版直接进入课程中心  Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】  CSS布局中意外空白:解决padding-top导致的顶部间距问题  微博网页版官方账号登录 微博网页版内容浏览使用指南  利用Bokeh CustomJS动态控制DataTable列可见性  sublime怎么格式化代码_sublime代码美化与一键排版插件配置  Go语言中Map存储的结构体如何调用指针方法:深入解析与实践  Django模型中自动计算可用余额的实现方法  小米Civi 4录制视频过暗_小米Civi 4亮度优化  包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址  聚水潭ERP登录页面入口 聚水潭ERP官网登录界面  在Typer应用中优雅地处理和重组任意命令行参数  多闪网页版在线观看免费入口_多闪官网访问入口  PyTorch模型训练准确率不提升:诊断与修复常见指标计算错误  QQ邮箱在线使用入口 QQ邮箱个人账号网页版登录  163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航  漫蛙漫画登录站点 漫蛙2正版漫画快速访问  手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议  Typer应用中动态命令行参数的解析与处理  提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案  《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!  响应式CSS Grid布局:优化网格项在小屏幕下的堆叠与宽度适配 

搜索