尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Python 如何使用 MySQL 的事务
后端开发中转账、订单创建、库存扣减这类业务必须保证多条数据库操作全部成功或者全部回滚这就是事务的价值。本文基于 pymysql 讲解 Python 下 MySQL 事务完整用法包含原理、代码示例、异常处理、常见坑与最佳实践。环境准备安装 pymysqlpipinstallpymysql注意MySQL 只有 InnoDB 引擎支持事务MyISAM 不支持事务。测试表准备CREATETABLEaccount(idINTPRIMARYKEYAUTO_INCREMENT,usernameVARCHAR(32)NOTNULL,balanceDECIMAL(12,2)NOTNULLDEFAULT0)ENGINEInnoDBDEFAULTCHARSETutf8mb4;INSERTINTOaccount(username,balance)VALUES(zhangsan,1000.00),(lisi,1000.00);什么是事务事务是一组SQL操作的逻辑单元全部执行成功执行commit()提交修改永久生效任意步骤失败执行rollback()回滚撤销这一组所有修改。ACID四大特性原子性(Atomicity)事务内操作不可分割全部成功或全部失败。一致性(Consistency)事务执行前后业务数据保持合法状态。隔离性(Isolation)多个事务之间互相隔离受事务隔离级别控制。持久性(Durability)commit提交之后修改永久保存数据库宕机也不会丢失。pymysql事务核心要点pymysql 默认autocommitTrue每条SQL执行后立即提交此时没有事务效果。使用事务必须关闭自动提交conn.autocommit(False)。两个关键方法conn.commit()提交事务conn.rollback()回滚事务同一个事务必须使用同一个connection连接对象不能换连接。示例1转账业务try‑except标准写法张三转账200元给李四模拟业务异常回滚。importpymysqldeftransfer():connpymysql.connect(host127.0.0.1,port3306,userroot,passwordxxx,databasetest_db,charsetutf8mb4)# 关闭自动提交开启事务模式conn.autocommit(False)cursorconn.cursor(pymysql.cursors.DictCursor)try:# 1. 张三扣200cursor.execute(UPDATE account SET balance balance - %s WHERE username %s,(200,zhangsan))# 2. 模拟异常触发回滚# 1 / 0# 3. 李四加200cursor.execute(UPDATE account SET balance balance %s WHERE username %s,(200,lisi))# 全部成功提交事务conn.commit()print(事务提交成功)exceptExceptionase:# 出现任何异常回滚所有变更conn.rollback()print(f事务回滚异常{e})finally:cursor.close()conn.close()if__name____main__:transfer()打开代码中1/0模拟报错你会发现两条update全部失效不会出现张三扣钱、李四没加钱的数据错乱。示例2with上下文管理器用法pymysql 的 connection 支持 with退出上下文如果没有commit会自动回滚。importpymysqldeftransfer_with():connpymysql.connect(host127.0.0.1,userroot,passwordxxx,databasetest_db,autocommitFalse,charsetutf8mb4)try:withconn.cursor(pymysql.cursors.DictCursor)ascur:cur.execute(UPDATE account SET balancebalance-%s WHERE username%s,(100,zhangsan))cur.execute(UPDATE account SET balancebalance%s WHERE username%s,(100,lisi))# with游标结束不会自动commit需要手动提交conn.commit()print(提交成功)exceptExceptionase:conn.rollback()print(f回滚{e})finally:conn.close()⚠️重要提醒with cursor()只是管理游标不会自动commit/rollback事务的提交回滚仍然由connection控制。示例3嵌套事务MySQL没有真正嵌套事务MySQL InnoDB 不支持真正嵌套事务可以使用保存点 savepoint实现局部回滚。defsavepoint_demo():connpymysql.connect(host127.0.0.1,userroot,passwordxxx,databasetest_db,autocommitFalse)curconn.cursor()try:cur.execute(UPDATE account SET balancebalance-50 WHERE usernamezhangsan)# 设置保存点cur.execute(SAVEPOINT sp1)cur.execute(UPDATE account SET balancebalance50 WHERE usernamelisi)# 回滚到保存点sp1只撤销后面的操作前面的保留cur.execute(ROLLBACK TO SAVEPOINT sp1)conn.commit()exceptExceptionase:conn.rollback()print(e)finally:cur.close()conn.close()常见踩坑清单autocommit忘记关闭autocommitTrue时每一条SQL直接生效commit/rollback完全无效事务失效。事务中途更换connection对象同一个事务的多条SQL必须在同一个连接换连接等于新开另一个事务。查询不会加锁update/delete才会产生事务变更普通select不会修改数据SELECT ... FOR UPDATE会开启行锁用于并发扣库存场景。异常捕获后忘记rollback如果发生异常不执行rollback未提交的事务会一直挂起占用数据库锁资源产生锁等待。MyISAM引擎使用事务MyISAM不支持事务commit/rollback调用无效果建表必须指定ENGINEInnoDB。长事务事务不要长时间不commit/rollback长事务会大量占用回滚段、锁资源严重影响数据库性能。结合SELECT FOR UPDATE并发扣库存场景悲观锁示例防止并发超卖defdeduct_stock():connpymysql.connect(host127.0.0.1,userroot,passwordxxx,databasetest_db,autocommitFalse)curconn.cursor()try:# for update 行锁其他事务会阻塞此处cur.execute(SELECT balance FROM account WHERE usernamezhangsan FOR UPDATE)rowcur.fetchone()ifrow[0]100:cur.execute(UPDATE account SET balancebalance-100 WHERE usernamezhangsan)conn.commit()exceptExceptionase:conn.rollback()print(e)finally:cur.close()conn.close()最佳实践总结业务涉及多写操作必须使用事务设置autocommitFalse。使用try‑except‑finally异常分支必须执行rollback()最后关闭连接。事务粒度尽量小避免长事务执行完尽快commit或rollback释放锁。并发场景需要锁时合理使用SELECT ... FOR UPDATE悲观锁或业务层乐观锁。确认表引擎为InnoDB。一个事务全程复用同一个数据库连接对象。如果你使用 SQLAlchemy ORM框架会封装事务逻辑但底层依然是MySQL事务机制。
RELATED

相关推荐

多语言支持实测: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
Instagram-Scraper高级用法:断点续传与CSV数据管理最佳实践

Instagram-Scraper高级用法:断点续传与CSV数据管理最佳实践

Instagram-Scraper高级用法:断点续传与CSV数据管理最佳实践 【免费下载链接】instagram-scraper Scrape the Instagram frontend. Inspired from twitter-scraper by kennethreitz. 项目地址: https://gitcode.com/gh_mirrors/in/instagram-scraper Instagra…

📅 2026/10/8 11:45:01
MORE NEWS

更多资讯

📰

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

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

📰

数据产品商业化:五种盈利模式与实施策略

1. 数据产品商业化的本质与价值数据产品商业化本质上是通过对原始数据进行加工、分析、封装,形成可交易、可复用的数据资产或数据服务的过程。这个过程将无形的数据资源转化为具有明确市场价值的产品形态,就像把原油提炼成汽油、柴油等不同标号的燃料产品…

📰

e2e端到端测试实战指南:从Profile配置到稳定性排障

做软件测试的同行看到"e2e"三个字母应该都不会陌生,全称end-to-end,端到端测试。但你真让我说清楚它解决什么、怎么落地、容易在哪儿翻车,我能聊很久。这篇就把我最近一次e2e改造的真实经历摊开讲,从测试范围划定、工具…

📰

深度学习性能建模:原理、实现与工程实践

1. 项目概述:深度学习性能建模的核心价值在深度学习项目落地过程中,我们常常遇到这样的困境:训练好的模型在实际部署时性能不达标,或者资源消耗远超预期。性能建模技术正是为了解决这类问题而生——它能在模型开发早期预测运行时表…

📰

Seedance 2.0:AI视频生成与物理引擎的融合技术解析

1. Seedance 2.0技术解析:当AI视频生成遇上物理引擎Seedance 2.0最核心的突破在于将传统视频生成技术与物理引擎深度融合。我们测试发现,其物理模拟精度达到毫米级,比如模拟布料飘落时,能准确计算每平方厘米面料受到的风阻系数。这…

📰

多模态高层融合技术与Transformer在机器人感知中的应用

1. 多模态高层融合的核心价值与挑战在机器人感知与决策系统中,多模态高层融合(High-Level Fusion)正成为突破性能瓶颈的关键技术。与早期特征级融合不同,高层融合直接在语义层面整合视觉、语音、触觉等多源信息,就像人…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

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

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

📞 💬