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

Python 使用 MySQL 数据库进行事务处理完整示例

事务(Transaction)是数据库操作的最小逻辑单元,遵循ACID 原则

  • 原子性(Atomicity):要么全部执行成功,要么全部失败回滚
  • 一致性(Consistency):执行前后数据库状态保持一致
  • 隔离性(Isolation):多个事务互不干扰
  • 持久性(Durability):提交后数据永久保存

Python操作MySQL时,默认是自动提交(autocommit)模式(执行单条SQL会立即生效),而事务处理需要先关闭自动提交,手动控制提交/回滚。

二、完整事务处理代码示例

以「转账场景」为例(经典的事务应用场景:A账户扣钱、B账户加钱,必须同时成功/失败):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

importmysql.connector

frommysql.connectorimportError

deftransfer_money(from_id, to_id, amount):

"""

模拟转账的事务处理

:param from_id: 转出账户ID

:param to_id: 转入账户ID

:param amount: 转账金额

"""

connection=None

try:

# 1. 建立数据库连接

connection=mysql.connector.connect(

host='localhost',

user='root',

password='123456',

database='test_db'

)

# 2. 关闭自动提交,开启手动事务控制

connection.autocommit=False

cursor=connection.cursor()

# 3. 执行事务内的多个SQL操作

# 步骤1:扣除转出账户金额

deduct_sql="UPDATE account SET balance = balance - %s WHERE id = %s"

cursor.execute(deduct_sql, (amount, from_id))

# 步骤2:增加转入账户金额

add_sql="UPDATE account SET balance = balance + %s WHERE id = %s"

cursor.execute(add_sql, (amount, to_id))

# 模拟异常(可取消注释测试回滚效果)

# raise Error("模拟转账异常,触发回滚")

# 4. 所有操作执行成功,提交事务

connection.commit()

print("转账成功!事务已提交")

exceptError as e:

# 5. 发生异常,回滚事务(撤销所有已执行的SQL操作)

ifconnection:

connection.rollback()

print(f"转账失败,事务已回滚!错误信息:{e}")

finally:

# 6. 释放资源(关闭游标和连接)

ifconnectionandconnection.is_connected():

cursor.close()

# 恢复自动提交(可选,不影响,但规范)

connection.autocommit=True

connection.close()

print("数据库连接已关闭")

# ==================== 测试前准备 ====================

# 先在MySQL中创建测试表和数据:

# CREATE DATABASE IF NOT EXISTS test_db;

# USE test_db;

# CREATE TABLE IF NOT EXISTS account (

# id INT PRIMARY KEY,

# name VARCHAR(50),

# balance DECIMAL(10,2)

# );

# INSERT INTO account (id, name, balance) VALUES (1, '张三', 1000.00), (2, '李四', 500.00);

# ==================== 执行转账测试 ====================

# 测试正常转账(张三给李四转200元)

transfer_money(from_id=1, to_id=2, amount=200.00)

三、关键操作解释

  1. 关闭自动提交
    connection.autocommit = False是开启事务的核心,关闭后执行的SQL不会立即生效,需手动commit()
  2. 事务提交
    connection.commit()仅当所有SQL执行无异常时调用,会将事务内所有操作永久写入数据库。
  3. 事务回滚
    connection.rollback()仅在捕获到异常时调用,会撤销事务内所有已执行的SQL操作,恢复到事务开始前的状态。
  4. 异常捕获
    必须用try-except包裹所有事务内的操作,确保任何错误都能触发回滚,避免数据不一致。

四、拓展场景:批量操作事务

如果需要批量插入/更新多条数据,事务同样适用,示例如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

defbatch_insert_users(users):

"""批量插入用户,使用事务保证全部成功/失败"""

connection=None

try:

connection=mysql.connector.connect(

host='localhost',

user='root',

password='123456',

database='test_db'

)

connection.autocommit=False

cursor=connection.cursor()

insert_sql="INSERT INTO user (name, age) VALUES (%s, %s)"

# 批量执行SQL(效率更高)

cursor.executemany(insert_sql, users)

connection.commit()

print(f"批量插入 {cursor.rowcount} 条数据成功")

exceptError as e:

ifconnection:

connection.rollback()

print(f"批量插入失败,事务回滚:{e}")

finally:

ifconnectionandconnection.is_connected():

cursor.close()

connection.autocommit=True

connection.close()

# 测试批量插入

user_list=[("王五",30), ("赵六",28), ("孙七",35)]

batch_insert_users(user_list)

到此这篇关于Python 使用 MySQL 数据库进行事务处理步骤的文章就介绍到这了

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

相关文章:

  • 2.0 直流充电控制电路:从连接握手到安全下电的全过程解析
  • 2026 保洁清洁推荐榜:鼎力管家领衔,精选小规模优质家政保洁收纳商业保洁机构 - 海棠依旧大
  • ThingsBoard规则链驱动Modbus设备智能控制实战
  • 2026年IC设计联发科面试题目带答案解析
  • 火速报名 | 2026中国高校计算机大赛——大数据挑战赛,五星级巅峰对决,邀您问鼎!
  • DPABI新手避坑指南:从DICOM到NIFTI,我的fMRI预处理血泪史(附4D转3D解决方案)
  • AI写教材必备!掌握这些方法,低查重率教材轻松编写!
  • Hermes Agent 完整指南:从安装到进阶玩法,一篇搞定
  • Three.js 小程序适配版终极指南:3分钟实现微信小程序3D渲染
  • PS 快速抠公章:不用钢笔,3 秒搞定红色印章
  • 笑死!AI 炼丹狂潮之下,就连股神巴菲特都被蒸馏成 skill 了!
  • 企业级IM软件的八大核心功能
  • 踩过等保的坑:KingbaseES身份验证全攻略,从口令管理到客户端认证实操
  • 5分钟快速上手WindowResizer:免费强制调整任意窗口大小的终极解决方案
  • 开源辅助驾驶Openpilot硬件选型与乐视手机供电改造实战
  • AI 应用前端展示:Streamlit 快速构建交互式 Web 应用
  • 【个人CNN学习记录之LeNet pytorch代码分析】
  • CSS如何实现元素隐藏不占位_使用display-none完全移除
  • 如何用GetQzonehistory完整备份QQ空间说说历史记录:终极免费解决方案
  • Altium Designer 23导出Gerber文件保姆级教程,附嘉立创下单全流程
  • AI时代高效管理个人笔记!Windows本地部署MaxKB,打造专属可视化知识库(超详细无坑版)
  • m4s-converter:B站缓存视频转换终极指南,三步拯救无法播放的珍贵内容
  • 2026年最新版看板管理系统大全:10个高效看板管理系统助力团队协作
  • 【Number0-高光谱检测技术-烂尾楼翻新】
  • CSS 悬停箭头闪烁偏移问题的根源与稳定解决方案
  • 【CS336】分词器:分词器原理与 BPE 实现
  • 开源神器Buzz深度评测:Whisper模型哪家强?实测对比tiny到large的准确率与速度
  • 线性代数实战:5分钟掌握二阶矩阵逆矩阵的快速计算技巧
  • 模型服务化:TorchServe 与 Triton Inference Server 深度实践
  • 用FastAPI从0到1写一个真正可用的接口服务