当前位置: 代码网 > it编程>前端脚本>Python > Python 使用 MySQL 数据库进行事务处理完整示例

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

2026年01月08日 Python 我要评论
一、事务核心概念(先理解再实操)事务(transaction)是数据库操作的最小逻辑单元,遵循 acid 原则:原子性(atomicity):要么全部执行成功,要么全部失败回滚一致性(consiste

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

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

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com