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事务 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++/Python混合编程之小结Pybind11的使用

    C++/Python混合编程之小结Pybind11的使用

    Pybind11是一个轻量级的C++库,用于将你的C++代码暴露给Python调用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-05-05
  • 学生如何注册Pycharm专业版以及pycharm的安装

    学生如何注册Pycharm专业版以及pycharm的安装

    这篇文章主要介绍了学生如何注册Pycharm专业版以及pycharm的安装,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Python操作列表的常用方法分享

    Python操作列表的常用方法分享

    这篇文章主要介绍了Python操作列表的常用方法,需要的朋友可以参考下
    2014-02-02
  • centos7之Python3.74安装教程

    centos7之Python3.74安装教程

    这篇文章主要介绍了centos7之Python3.74安装教程,本文给大家介绍的非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-08-08
  • Go/Python/Erlang编程语言对比分析及示例代码

    Go/Python/Erlang编程语言对比分析及示例代码

    这篇文章主要介绍了Go/Python/Erlang编程语言对比分析及示例代码,本文重点是给大家介绍go语言,从语言对比分析的角度切入介绍,需要的朋友可以参考下
    2018-04-04
  • python正则表达式(re模块)的使用详解

    python正则表达式(re模块)的使用详解

    正则表达式是用来匹配字符串非常强大的工具,在其他编程语言中同样有正则表达式的概念,Python同样不例外,下面这篇文章主要给大家介绍了关于python正则表达式(re模块)使用的相关资料,需要的朋友可以参考下
    2022-03-03
  • 学习python需要有编程基础吗

    学习python需要有编程基础吗

    在本篇文章里小编给大家分享的是一篇关于学习python有哪些必要条件,需要的朋友们可以学习下。
    2020-06-06
  • Python人脸识别初探

    Python人脸识别初探

    这篇文章主要为大家详细介绍了Python人脸识别初探的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • python散点图实例之随机漫步

    python散点图实例之随机漫步

    这篇文章主要为大家详细介绍了python散点图实例之随机漫步,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • python opencv 批量改变图片的尺寸大小的方法

    python opencv 批量改变图片的尺寸大小的方法

    这篇文章主要介绍了python opencv 批量改变图片的尺寸大小的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06

最新评论