尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Python MySQL 错误回滚实战代码

Python MySQL 错误回滚实战代码
📅 发布时间:2026/6/22 2:14:15

这个例子模拟了一个经典的“转账”场景:A 给 B 转钱,如果在扣款后、收款前系统发生错误(比如断电、代码异常),必须让数据回到转账前的状态,保证钱不凭空消失。

环境准备:
你需要安装pymysql库:

pipinstallpymysql

代码实现:

importpymysqlimportsys# 数据库配置(请根据你的实际情况修改)DB_CONFIG={'host':'localhost','user':'root','password':'your_password','database':'test_db','charset':'utf8mb4'}defsetup_database(cursor):"""初始化测试表和数据"""try:cursor.execute("DROP TABLE IF EXISTS accounts")cursor.execute(""" CREATE TABLE accounts ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), balance DECIMAL(10, 2) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 """)# 插入初始数据:Alice有1000元,Bob有500元cursor.execute("INSERT INTO accounts (name, balance) VALUES ('Alice', 1000.00)")cursor.execute("INSERT INTO accounts (name, balance) VALUES ('Bob', 500.00)")print("✅ 数据库初始化完成:Alice=1000, Bob=500")exceptExceptionase:print(f"❌ 初始化失败:{e}")deftransfer_money_with_rollback(from_user,to_user,amount):""" 模拟转账业务,并在发生错误时回滚 """connection=Nonetry:# 1. 建立连接connection=pymysql.connect(**DB_CONFIG)# 2. 关键步骤:关闭自动提交,开启事务connection.autocommit(False)withconnection.cursor()ascursor:# --- 步骤一:扣款 ---print(f"\n💰 正在从{from_user}扣除{amount}元...")sql_deduct="UPDATE accounts SET balance = balance - %s WHERE name = %s"cursor.execute(sql_deduct,(amount,from_user))# 模拟查询扣款后的余额(仅为了演示,实际业务中可能不需要)cursor.execute("SELECT balance FROM accounts WHERE name = %s",(from_user,))result=cursor.fetchone()print(f" 👉 扣款后查询{from_user}余额:{result[0]}(此时数据在内存/Redo Log中,未永久落盘)")# --- 步骤二:模拟突发异常 ---# 比如:此时服务器断电、网络中断、或者代码逻辑错误print("⚠️ 模拟系统崩溃:准备加款时发生除零错误!")error_simulation=1/0# 故意制造一个异常# --- 步骤三:加款(正常情况下会执行,但上面报错了就不会走到这) ---sql_add="UPDATE accounts SET balance = balance + %s WHERE name = %s"cursor.execute(sql_add,(amount,to_user))# 3. 如果一切顺利,提交事务connection.commit()print("✅ 转账成功,事务已提交!")exceptExceptionase:print(f"\n❌ 发生严重错误:{e}")ifconnection:# 4. 核心:发生任何异常,回滚所有操作print("🔄 正在执行回滚操作 (ROLLBACK)...")connection.rollback()print("🛡️ 回滚成功!数据已恢复到事务开始前的状态。")finally:ifconnection:# 5. 恢复自动提交模式并关闭连接connection.autocommit(True)connection.close()defcheck_final_balance():"""检查最终结果"""conn=pymysql.connect(**DB_CONFIG)withconn.cursor()ascursor:cursor.execute("SELECT name, balance FROM accounts")results=cursor.fetchall()print("\n----- 最终账户余额 -----")forrowinresults:print(f"用户:{row[0]}, 余额:{row[1]}")print("------------------------")# 验证结果alice_balance=results[0][1]ifresults[0][0]=='Alice'elseresults[1][1]bob_balance=results[0][1]ifresults[0][0]=='Bob'elseresults[1][1]assertalice_balance==1000,f"Alice余额错误!期望1000,实际{alice_balance}"assertbob_balance==500,f"Bob余额错误!期望500,实际{bob_balance}"print("🎉 验证通过:数据一致,回滚生效!")conn.close()if__name__=="__main__":# 初始化conn_init=pymysql.connect(**DB_CONFIG)withconn_init.cursor()ascur:setup_database(cur)conn_init.commit()conn_init.close()# 执行带回滚的转账transfer_money_with_rollback('Alice','Bob',200)# 检查最终数据是否正确回滚check_final_balance()

代码讲解重点(写进博客里):

  1. connection.autocommit(False):这是事务的开关。默认情况下 MySQL 是自动提交的(每句 SQL 都是一个事务),关掉它才能把多步操作打包成一个整体。
  2. try...except...结构:业务逻辑必须放在try里。
  3. connection.rollback():这是“后悔药”。一旦进入except块,调用此方法会撤销从autocommit(False)之后的所有未提交更改。
  4. connection.commit():这是“确认键”。只有执行了这个,数据才真正写入磁盘(配合 Redo Log 和 Binlog)。
  5. Engine=InnoDB:注意建表时指定了引擎为 InnoDB。如果是 MyISAM 引擎,它不支持事务,rollback会失效!这是面试常考点。

运行这个脚本,你会看到虽然执行了扣款 SQL,但因为中间报错触发了回滚,最后 Alice 的钱还是 1000,Bob 还是 500,完美保证了数据的一致性。

相关新闻

  • 2026年上海钟表维修推荐:聚焦高端名表案例的4家优质售后中心评测 - 十大品牌推荐
  • 2026年上海修手表站推荐:聚焦高端名表案例的4家高可靠性服务商盘点。 - 十大品牌推荐
  • 8分钟快速搭建Kubernetes测试环境:kubeasz AllinOne完整实践指南

最新新闻

  • 金融合规策略数据库设计:结构化存储与高性能查询优化实践
  • 极端天气下电力系统鲁棒调度优化实践
  • 2026荆州漏水检测维修本地口碑防水商家榜单:厨卫/阳台/屋面/地下室渗漏水维修,持证施工+明码实价,防水补漏公司TOP5推荐 - 即刻修防水
  • 轻量级AI音乐生成模型TinyMU:2.29亿参数媲美大模型的架构与实战
  • UniEditBench:基于知识蒸馏的统一多模态编辑评测基准
  • 高穹全域透视·智网自主抗毁|空基立体感知·全域精准管控

日新闻

  • 2026速览惠州叛逆青少年学校前十大排名名单出炉 - 武汉中职最新信息发布
  • 2026上饶白蚁消杀哪家好?15年本土2大权威白蚁防治公司推荐(金盾虫控/青蚁卫士) - 我叫一
  • 天龙八部单机版终极数据管理工具:5个技巧快速掌握游戏数据编辑

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号