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

 更新时间:2026年01月08日 11:16:13   作者:爱吃提升  
本文介绍了Python中使用MySQL进行事务处理的基本概念和步骤,包括事务的核心概念(ACID原则)、事务处理代码示例、关键操作解释以及拓展场景,感兴趣的朋友跟随小编一起看看吧

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

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

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

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

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

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

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 包裹所有事务内的操作,确保任何错误都能触发回滚,避免数据不一致。

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

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

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)

到此这篇关于Python 使用 MySQL 数据库进行事务处理步骤的文章就介绍到这了,更多相关python mysql事务 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 对python中词典的values值的修改或新增KEY详解

    对python中词典的values值的修改或新增KEY详解

    今天小编就为大家分享一篇对python中词典的values值的修改或新增KEY详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • 基于Python实现音乐节奏可视化效果

    基于Python实现音乐节奏可视化效果

    这篇文章主要为大家详细介绍了如何基于Python语言实现音乐节奏可视化效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-06-06
  • Python构建简单线性回归模型

    Python构建简单线性回归模型

    这篇文章主要介绍了Python构建简单线性回归模型,线性回归表示发现函数使用线性组合表示输入变量。简单线性回归很容易理解,使用了基本的回归技术,一旦理解了这些基本概念,可以更好地学习其他类型的回归模型
    2022-08-08
  • 解决python 文本过滤和清理问题

    解决python 文本过滤和清理问题

    文本过滤和清理所涵盖的范围非常广泛,涉及文本解析和数据处理方面的问题。这篇文章主要介绍了解决python 文本过滤和清理问题,需要的朋友可以参考下
    2019-08-08
  • pytorch中的numel函数用法说明

    pytorch中的numel函数用法说明

    这篇文章主要介绍了pytorch中的numel函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • python FTP批量下载/删除/上传实例

    python FTP批量下载/删除/上传实例

    今天小编就为大家分享一篇python FTP批量下载/删除/上传实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • python游戏实战项目之俄罗斯方块的魅力

    python游戏实战项目之俄罗斯方块的魅力

    迟早一定会挂掉的俄罗斯方块,为什么至今仍是世界游戏之王?它是怎么编写的?本文将给大家详细的介绍,对大家的学习或工作具有一定的参考借鉴价值
    2021-09-09
  • Python爬虫headers处理及网络超时问题解决方案

    Python爬虫headers处理及网络超时问题解决方案

    这篇文章主要介绍了Python爬虫headers处理及网络超时问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Python采集热搜数据实现详解

    Python采集热搜数据实现详解

    这篇文章主要为大家介绍了Python采集热搜数据实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • 在Python中使用Neo4j的方法

    在Python中使用Neo4j的方法

    今天小编就为大家分享一篇关于在Python中使用Neo4j的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03

最新评论