news 2026/4/17 22:59:04

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 数据库进行事务处理步骤的文章就介绍到这了

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 22:57:16

无人机飞行日志分析实战指南:从原始数据到深度洞察

无人机飞行日志分析实战指南:从原始数据到深度洞察 【免费下载链接】UAVLogViewer An online viewer for UAV log files 项目地址: https://gitcode.com/gh_mirrors/ua/UAVLogViewer UAVLogViewer 是一款专业的基于 JavaScript 的无人机飞行日志分析工具&…

作者头像 李华
网站建设 2026/4/17 22:56:21

【个人CNN学习记录之LeNet pytorch代码分析】

系列文章目录 个人CNN学习记录之LeNet pytorch代码分析 文章目录系列文章目录前言一、Lenet模型架构一、网络的历史地位与意义二、网络结构层次详解二、代码分析model.pytrain.pypredict.py总结前言 在日常工作中,我专注于并行计算领域,主要依托GPGPU、…

作者头像 李华
网站建设 2026/4/17 22:55:35

矽力杰 Silergy SA21308B 低压差线性稳压器 佰祥电子

突破车载供电可靠性与功耗痛点!SA21308B车规级AEC-Q100110mV超低压差的五大核心优势导语:当前在智能座舱信息娱乐系统、汽车仪表盘显示屏以及高级车载摄像头等车规级电子设备的设计中,工程师们普遍面临着车载电网环境极其恶劣、对低压差线性稳…

作者头像 李华
网站建设 2026/4/17 22:55:34

告别繁琐计算!用QT集成这个CANFD波特率计算器,配置效率翻倍

告别繁琐计算!用QT集成这个CANFD波特率计算器,配置效率翻倍 在嵌入式开发领域,CANFD(Controller Area Network Flexible Data-rate)协议因其更高的数据传输速率和更大的数据负载能力,正逐渐取代传统CAN总线…

作者头像 李华
网站建设 2026/4/17 22:53:37

终极Windows优化工具:Win11Debloat让系统重获新生

终极Windows优化工具:Win11Debloat让系统重获新生 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and custom…

作者头像 李华
网站建设 2026/4/17 22:52:24

轴承润滑脂:机械运转的“生命血液”

轴承润滑脂:机械运转的“生命血液”轴承是工业设备中减少摩擦、支承转动的核心元件。而轴承润滑脂则被誉为轴承的“生命血液”,其性能的优劣直接关系到设备的运行稳定性、能耗以及使用寿命。一、 润滑脂的基本构成理解润滑脂,可以将其类比为一…

作者头像 李华