返回顶部
分享到

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

python 来源:互联网 作者:佚名 发布时间:2026-01-08 21:07:12 人浏览
摘要

一、事务核心概念(先理解再实操) 事务(Transaction)是数据库操作的最小逻辑单元,遵循ACID 原则: 原子性(Atomicity):要么全部执行成功,要么全部失败回滚 一致性(Consistency):执行前

一、事务核心概念(先理解再实操)

事务(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

import mysql.connector

from mysql.connector import Error

def transfer_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("转账成功!事务已提交")

    except Error as e:

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

        if connection:

            connection.rollback()

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

    finally:

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

        if connection and connection.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

def batch_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} 条数据成功")

    except Error as e:

        if connection:

            connection.rollback()

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

    finally:

        if connection and connection.is_connected():

            cursor.close()

            connection.autocommit = True

            connection.close()

# 测试批量插入

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

batch_insert_users(user_list)


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • Python使用MySQL数据库进行事务处理示例
    一、事务核心概念(先理解再实操) 事务(Transaction)是数据库操作的最小逻辑单元,遵循ACID 原则: 原子性(Atomicity):要么全部执行成
  • Python多进程与多线程适用场景案例
    你想明确多进程和多线程各自的适用场景,核心是要结合任务类型、资源需求、数据共享等维度来判断简单来说,IO密集型任务优先用多线程
  • 使用Python实现一个自动整理音乐文件脚本
    一、音乐文件管理的痛点与解决方案 现代音乐收藏常面临杂乱无章的问题:同一艺术家的歌曲散落在不同文件夹,专辑被错误命名,甚至文
  • Python中as关键字的作用实例介绍
    在 Python 中,as是一个关键字,核心语义是将某个对象绑定到指定的变量(或给对象起别名),从而简化代码操作、访问对象属性。它主要应
  • Python使用urllib和requests发送HTTP请求的方法
    本文通过天气API示例演示了实际应用,并提供了超时设置、错误处理和JSON解析等实用技巧。推荐大多数场景使用requests库,同时强调了异常
  • 在Mac上安装最新版本Python的方法

    在Mac上安装最新版本Python的方法
    所有最新的 MacOS(从 macOS 12.3 开始)都预装了 Python 版本(通常是 Python 2.x),但它已经过时并且不再受支持。要充分利用 Python 的功能,您
  • python serial模块使用方法
    在Python中实现串口通信,最常用且功能强大的库是pySerial(通常通过import serial导入) 。它支持跨平台操作(Windows、Linux、macOS),提供了完
  • pytorch中torch.cat和torch.stack的区别

    pytorch中torch.cat和torch.stack的区别
    torch.cat和torch.stack是 PyTorch 中用于组合张量的两个常用函数,它们的核心区别在于输入张量的维度和输出张量的维度变化。以下是详细对比:
  • Python实现快速扫描目标主机的开放端口和服务
    功能介绍 这是一个功能强大的端口扫描器脚本,能够快速扫描目标主机的开放端口和服务。该脚本具备以下核心功能: 多种扫描模式:支持
  • Python轻松实现Word到Markdown的转换
    在文档管理、内容发布等场景中,将 Word(.doc/.docx)转换为 Markdown 格式是常见需求。Markdown 的轻量、跨平台、易编辑特性,使其更适配网页
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计