当前位置: 首页 > news >正文

Python 操作 MySQL 事务:从入门到避坑

在实际开发中,单条 SQL 往往不够用。转账、订单处理、库存扣减……这些场景要求多条 SQL要么全成功,要么全失败。这就是事务存在的意义。

本文用 Python 实战讲解如何正确使用 MySQL 事务,覆盖pymysqlmysql-connector-pythonSQLAlchemy三种主流方式。


一、先搞懂事务的核心:ACID

特性含义举例
Atomicity(原子性)操作不可分割,全做或全不做转账:扣款和入账必须同时成功
Consistency(一致性)事务前后数据保持一致余额不能凭空消失
Isolation(隔离性)并发事务互不干扰两人同时取钱,不能互相影响
Durability(持久性)提交后数据永久保存服务器重启数据不丢失

一句话:事务就是保证数据不出乱子的机制。


二、方式一:pymysql(最常用)

2.1 基本用法

importpymysql conn=pymysql.connect(host='localhost',user='root',password='your_password',database='test_db',charset='utf8mb4')try:withconn.cursor()ascursor:# 开启事务(默认就是手动提交模式)sql1="UPDATE accounts SET balance = balance - 100 WHERE user_id = 1"sql2="UPDATE accounts SET balance = balance + 100 WHERE user_id = 2"cursor.execute(sql1)cursor.execute(sql2)# 全部成功,提交conn.commit()print("转账成功")exceptExceptionase:# 任何一步出错,回滚conn.rollback()print(f"转账失败,已回滚:{e}")finally:conn.close()

2.2 关键点

  • conn.commit()提交事务
  • conn.rollback()回滚事务
  • 出错必须回滚,否则已执行的 SQL 不会撤销
  • 默认autocommit=False,所以需要手动提交

三、方式二:mysql-connector-python(官方驱动)

importmysql.connector conn=mysql.connector.connect(host='localhost',user='root',password='your_password',database='test_db')cursor=conn.cursor()try:cursor.execute("UPDATE accounts SET balance = balance - 100 WHERE user_id = 1")cursor.execute("UPDATE accounts SET balance = balance + 100 WHERE user_id = 2")conn.commit()exceptmysql.connector.Erroraserr:conn.rollback()print(f"Error:{err}")finally:cursor.close()conn.close()

pymysql逻辑一致,只是 API 略有不同。


四、方式三:SQLAlchemy ORM(推荐大型项目)

fromsqlalchemyimportcreate_engine,Column,Integer,Stringfromsqlalchemy.ormimportsessionmaker,declarative_base Base=declarative_base()classAccount(Base):__tablename__='accounts'id=Column(Integer,primary_key=True)name=Column(String(50))balance=Column(Integer)engine=create_engine('mysql+pymysql://root:password@localhost/test_db')Session=sessionmaker(bind=engine)session=Session()try:account1=session.query(Account).filter_by(id=1).with_for_update().first()account2=session.query(Account).filter_by(id=2).with_for_update().first()account1.balance-=100account2.balance+=100session.commit()print("转账成功")exceptExceptionase:session.rollback()print(f"转账失败:{e}")finally:session.close()

为什么用with_for_update()

普通查询在并发下可能读到脏数据。with_for_update()加行锁,确保这条记录在事务结束前不被其他事务修改,解决并发问题。


五、三种方式对比

维度pymysqlmysql-connectorSQLAlchemy
上手难度⭐⭐⭐⭐⭐⭐⭐
性能稍慢(有 ORM 开销)
适用场景轻量脚本、小项目官方驱动、稳定需求中大型项目
并发控制手动写 SQL手动写 SQLwith_for_update()内置

选型建议:小项目用pymysql,追求稳定用官方驱动,项目大了直接上 SQLAlchemy。


六、常见坑 & 最佳实践

坑1:异常没捕获,事务没回滚

# ❌ 错误示范cursor.execute(sql1)cursor.execute(sql2)# 如果这里报错,sql1 已执行但没回滚conn.commit()

必须用 try/except 包裹,except 里调用rollback()

坑2:连接池里的事务混乱

用连接池时,确保一个连接只处理一个事务,不要跨连接做事务操作。

坑3:忘了设置隔离级别

MySQL 默认隔离级别是REPEATABLE READ,但有些场景需要READ COMMITTED

conn.begin()# 显式开启事务cursor.execute("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")

最佳实践清单

  • ✅ 事务里的 SQL 尽量少,减少锁持有时间
  • ✅ 捕获所有异常,确保回滚
  • ✅ 高并发场景加行锁(SELECT ... FOR UPDATE
  • ✅ 生产环境用连接池(如DBUtilsSQLAlchemy内置池)
  • ✅ 不要在事务里做网络请求、文件 IO 等耗时操作

七、总结

你的场景推荐方案
写个脚本批量处理数据pymysql+ 手动 commit/rollback
官方项目,求稳定mysql-connector-python
Web 项目、多人协作SQLAlchemy+with_for_update()

事务不复杂,但用错了比不用更危险。记住三个动作:begin → commit / rollback → close,就能覆盖 90% 的场景。

http://www.jsqmd.com/news/917633/

相关文章:

  • 超越基础图表:用DataEase+InfluxDB插件挖掘时序数据价值(监控/物联网场景应用指南)
  • 2026年泸州白酒OEM代工与企业定制:源头酒厂直营模式解读 - 优质企业观察收录
  • 2026 杭州除异味公司推荐,厨卫地下室顽固臭味治理,甄选长效不反弹靠谱治理企业 - 品牌榜中榜
  • 2026年黄金变现需求持续升温 全国黄金回收门店业态多维解析 - 兔兔不是荼荼
  • 3步告别公式噩梦:LaTeX2Word-Equation如何让数学公式迁移变得轻松
  • 从灰度图到彩图:ENVI中土地利用分类数据的显示与制图避坑指南
  • AIOps智能运维实战:从数据治理到算法落地的渐进式指南
  • 2026宁波拉链批发多品牌现货供应链全景:YKK/SBS/SAB/YCC一站式采购完全对比 - 优质企业观察收录
  • 模拟电路图到网表的自动化转换技术解析
  • 左连接 LEFT JOIN|工作使用率最高,实战场景详解(避坑重点)
  • 济南黄金回收资讯:丽坤奢品汇多城布局实体门店18617962974 提供正规综合回收服务 - 资讯纵览
  • 2026年泸州白酒OEM定制全产业链服务商深度解析:源头酒厂如何成为B端供应链的核心锚点 - 优质企业观察收录
  • 如何用QKeyMapper打造终极Windows按键映射方案:免费开源工具完全指南
  • 2026年上海各区改善型住房全屋定制品牌实景口碑排行 - 高定
  • 开源Perseus项目:无偏移地址架构的《碧蓝航线》原生补丁完整指南
  • 魔兽争霸3老玩家必看:如何让经典游戏在现代电脑上流畅运行?
  • 鲜花销售小程序|基于微信小程序的鲜花销售系统设计与实现(源码+数据库+文档)
  • 告别线缆束缚:用DRG WL-CMSIS-DAP无线调试器搞定STM32/GD32远程烧录与调试
  • 5个神奇技巧:用Diffuse图形化工具轻松搞定代码对比与合并
  • 南宁川石装饰官方联系方式合作电话官方网站官网 - 元点智创
  • 杭州低糖健康糕点排行榜!减脂老人小孩都能吃,伴手礼不踩雷 - 玖叁鹿geo
  • 5分钟搞定:Synology Audio Station QQ音乐歌词插件终极配置指南
  • 2026年 西安消防器材/消防设备/消防设施厂家推荐榜单:灭火器、消火栓、消防箱与防火装备专业实力深度解析 - 品牌企业推荐师(官方)
  • Creality Print 6.0:从新手到专家的3D打印切片软件完全指南
  • Keil μVision调试器变量观察冲突解决方案
  • DIY绝缘面团制作指南:原理、配方与电路安全应用
  • 告别树莓派溢价!652元入手的Radxa ROCK 5A 8GB版,性能实测与上手避坑指南
  • 2026年宁波拉链批发全品牌现货采购:YKK、SBS、SAB、YCC多品牌供应链选型实战 - 优质企业观察收录
  • 2026年嘉兴奢响佳黄金回收深度问答:报价规则、称重标准、服务承诺全公开 - 天天生活分享日志
  • 2026洛氏硬度计厂家推荐 | 行业主流品牌实力盘点及采购选购指南 - 商业新知