尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Python能不能写一个验证事务效果的样例代码
很多开发者学习MySQL事务的时候只停留在理论层面不知道事务真正生效是什么样子。本文提供两套对照可运行代码无事务产生脏数据、开启事务异常自动回滚。直接运行代码观察数据库数据变化直观验证事务效果。环境准备安装依赖pipinstallpymysql测试表SQL必须使用InnoDB引擎MyISAM不支持事务。CREATETABLEaccount(idINTPRIMARYKEYAUTO_INCREMENT,usernameVARCHAR(32)NOTNULL,balanceDECIMAL(12,2)NOTNULLDEFAULT0)ENGINEInnoDBDEFAULTCHARSETutf8mb4;-- 初始化测试数据张三、李四各1000元INSERTINTOaccount(username,balance)VALUES(张三,1000.00),(李四,1000.00);业务场景张三转账200元给李四。流程张三余额扣减200模拟程序抛出异常李四余额增加200案例一不使用事务自动提交产生脏数据pymysql默认autocommitTrue每执行一条SQL就直接写入数据库。当中间代码抛出异常后面SQL无法执行就会出现一部分成功、一部分失败的数据错乱。importpymysqldefdemo_without_transaction():# 默认 autocommitTrueconnpymysql.connect(host127.0.0.1,port3306,userroot,password你的密码,databasetest_db,charsetutf8mb4)cursorconn.cursor()# 1.张三扣200这条SQL立刻生效落库cursor.execute(UPDATE account SET balance balance - %s WHERE username%s,(200,张三))# 模拟业务异常、接口报错、程序崩溃print(模拟程序发生异常)1/0# 2.李四加钱这行代码永远不会执行cursor.execute(UPDATE account SET balance balance %s WHERE username%s,(200,李四))cursor.close()conn.close()if__name____main__:demo_without_transaction()运行现象程序抛出ZeroDivisionError异常终止查询数据库张三余额变成800李四仍然1000出现脏数据钱凭空消失业务逻辑被破坏⚠️复现完成后记得重置表数据方便测试下一个案例。UPDATEaccountSETbalance1000.00;案例二开启事务异常自动回滚关键点设置conn.autocommit False关闭自动提交所有修改操作先在事务缓冲区不会真正写入数据库正常执行完毕调用conn.commit()持久化数据捕获异常调用conn.rollback()撤销全部修改importpymysqldefdemo_with_transaction():connpymysql.connect(host127.0.0.1,port3306,userroot,password你的密码,databasetest_db,charsetutf8mb4)# 关闭自动提交开启事务模式conn.autocommitFalsecursorconn.cursor()try:# 第一步张三扣款cursor.execute(UPDATE account SET balance balance - %s WHERE username%s,(200,张三))# 模拟异常触发回滚逻辑print(模拟程序发生异常)1/0# 第二步李四收款cursor.execute(UPDATE account SET balance balance %s WHERE username%s,(200,李四))# 全部执行成功提交事务数据真正写入数据库conn.commit()print(✅事务提交成功转账完成)exceptExceptionase:# 出现任何异常回滚本次事务所有变更conn.rollback()print(f❌捕获异常事务已全部回滚异常信息{e})finally:cursor.close()conn.close()if__name____main__:demo_with_transaction()运行现象异常分支程序抛出除零异常进入except代码块执行rollback()查询数据库张三、李四余额依旧都是1000数据完全没有变化所有update操作全部撤销不会产生脏数据测试正常提交场景把代码中的1 / 0注释掉再次运行。不会触发异常执行commit()数据库张三800李四1200转账业务正常完成。案例三演示部分回滚SAVEPOINT保存点MySQL支持保存点可以实现事务内部局部回滚不需要全部回滚。importpymysqldefdemo_savepoint():connpymysql.connect(host127.0.0.1,port3306,userroot,password你的密码,databasetest_db,autocommitFalse,charsetutf8mb4)curconn.cursor()try:cur.execute(UPDATE account SET balancebalance-100 WHERE username张三)# 设置保存点sp1cur.execute(SAVEPOINT sp1)cur.execute(UPDATE account SET balancebalance100 WHERE username李四)# 回滚到保存点撤销上面李四加钱操作张三扣钱保留cur.execute(ROLLBACK TO SAVEPOINT sp1)conn.commit()print(保存点演示完成)exceptExceptionase:conn.rollback()print(f异常回滚{e})finally:cur.close()conn.close()对比总结表场景无事务 autocommitTrue开启事务 autocommitFalse程序中途报错部分SQL生效生成脏数据全部操作回滚数据不变程序正常结束逐条SQL立即生效commit之后统一生效开发避坑要点autocommitFalse是开启事务的前提忘记关闭自动提交commit/rollback完全无效。同一个事务内所有SQL必须使用同一个connection对象更换连接代表全新事务。异常分支必须手动执行rollback()否则未提交事务会挂起占用数据库锁资源。表引擎必须是InnoDBMyISAM不支持事务。尽量缩小事务粒度避免长事务长事务会造成锁等待、数据库性能下降。SELECT查询语句不会修改数据不会产生事务变更SELECT ... FOR UPDATE会增加行锁。业务模板订单、库存、转账等多写业务直接套用这套模板conn.autocommitFalsetry:# 多条写sqlconn.commit()exceptException:conn.rollback()finally:conn.close()通过以上样例代码就可以直观验证MySQL事务原子性效果一组操作要么全部成功要么全部撤销。
RELATED

相关推荐

Python 如何使用 MySQL 的事务

Python 如何使用 MySQL 的事务

后端开发中,转账、订单创建、库存扣减这类业务,必须保证多条数据库操作全部成功或者全部回滚,这就是事务的价值。本文基于 pymysql 讲解 Python 下 MySQL 事务完整用法,包含原理、代码示例、异常处理、常见坑与最佳实践。 环境准备…

📅 2026/10/26 22:10:14
多语言支持实测:DeepSeek-V4-Pro-Qwen3.5-4B-8bit在英中日等6种语言表现如何?

多语言支持实测:DeepSeek-V4-Pro-Qwen3.5-4B-8bit在英中日等6种语言表现如何?

多语言支持实测:DeepSeek-V4-Pro-Qwen3.5-4B-8bit在英中日等6种语言表现如何? 【免费下载链接】DeepSeek-V4-Pro-Qwen3.5-4B-8bit 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/DeepSeek-V4-Pro-Qwen3.5-4B-8bit DeepSeek-V4-Pro…

📅 2026/10/10 19:33:55
Git管理Obsidian笔记:版本控制与高效协作指南

Git管理Obsidian笔记:版本控制与高效协作指南

1. 为什么需要Git管理Obsidian笔记 作为一个长期使用Obsidian的重度用户,我深刻体会到版本控制的重要性。去年某次系统崩溃导致我丢失了整整两周的笔记修改记录,那次惨痛经历让我彻底放弃了手动备份这种不可靠的方式。Git作为最成熟的版本控制系统&#…

📅 2026/9/17 15:46:23
MORE NEWS

更多资讯

📰

SAP CO-PC成本核算实操:标准成本、物料分类账与月结差异分析

简介:面向SAP顾问、财务骨干及成本会计学习者的成本核算培训演示文稿,围绕产品成本控制模块展开,系统讲解标准成本体系、成本对象控制、实际成本核算与物料分类账等核心内容,重点剖析标准成本核算体系的构成,以及成本差…

📰

编程智能体如何改变程序员工作方式:从写代码到定义问题

1. 先别急着学“提示词”,先搞懂“智能体”到底解决了我什么痛点2025年开始,我身边不少同事一提到“AI编程”这个词,第一反应就是“这不就是一个更聪明的自动补全吗”。说实话,我自己也经历过这个误区,ChatGPT、Copilo…

📰

文本生成模型怎么选?三个硬指标看火山引擎核心竞争力

"文本生成模型推荐哪家?从3个硬指标看火山引擎的核心竞争力"1. 选文本生成模型这么多年,我发现大部分人的评测方式都有问题我这些年做过不下二十次的文本生成模型选型,从最早的GPT-2时代一直跟到现在的大模型混战。每次有新项目要接…

📰

排序算法详解:从基础到高级优化实践

1. 排序算法概述排序是计算机科学中最基础也最重要的算法之一。作为一名从业十年的工程师,我处理过无数与排序相关的实际问题。排序算法的本质是将一组数据按照特定顺序重新排列的过程,这个看似简单的操作在实际工程中却有着千变万化的应用场景和优化空间…

📰

湖南GEO优化服务市场分析与技术趋势

1. 2026湖南GEO优化行业现状与背景GEO优化服务(地理空间数据优化服务)作为数字经济发展的基础设施,正在湖南地区迎来爆发式增长。2026年,湖南省数字经济规模预计突破3.5万亿元,其中地理信息产业占比达12%,这…

📰

MySQL主从复制配置与高可用架构实践指南

1. MySQL主从配置:高可用架构的基石实践上周刚帮一家电商平台解决了数据库单点故障引发的服务中断问题,核心方案就是MySQL主从复制。这种架构不仅能实现故障快速切换,还能分担主库压力,是每个DBA必须掌握的生存技能。今天我就用最…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬