菜鸟科技网

MySQL命令如何提交执行?

“提交”意味着将事务中的所有操作永久保存到数据库中,使其对其他用户可见,反之,“回滚”则会撤销事务中的所有操作,数据库恢复到事务开始前的状态。

MySQL命令如何提交执行?-图1
(图片来源网络,侵删)

下面我将从几个方面详细解释如何提交,包括基本命令、不同客户端环境下的操作以及相关概念。


核心命令:COMMIT

COMMIT 是 SQL 标准命令,用于提交当前事务。

基本语法:

COMMIT;

作用:

MySQL命令如何提交执行?-图2
(图片来源网络,侵删)
  1. 永久化更改:将自上一个 COMMITROLLBACK 以来执行的所有 INSERTUPDATEDELETE 操作永久写入数据库。
  2. 释放锁:释放事务期间获取的锁,允许其他事务访问这些数据。
  3. 结束事务:正式结束当前事务,数据库会自动开启一个新的事务。

不同环境下的操作方式

在 MySQL 命令行客户端 中

这是最常见的情况,MySQL 命令行客户端默认是自动提交模式

  • 自动提交 (autocommit=ON)

    • 默认行为:每执行一条 DML 语句(INSERT, UPDATE, DELETE),MySQL 都会自动执行一个 COMMIT,你不需要手动输入 COMMIT
    • 如何查看:执行 SELECT @@autocommit;,返回 1 表示开启,0 表示关闭。
    • 示例
      mysql> UPDATE accounts SET balance = balance - 100 WHERE id = 1;
      -- 这条语句执行后,更改会立即生效,无需提交。
  • 手动提交 (autocommit=OFF)

    • 何时使用:当你需要将多个操作作为一个原子单元(要么全部成功,要么全部失败)时,必须关闭自动提交,使用事务。

      MySQL命令如何提交执行?-图3
      (图片来源网络,侵删)
    • 如何关闭自动提交

      SET autocommit = 0;
      -- 或者
      START TRANSACTION; -- 这也会临时关闭自动提交
    • 操作流程

      1. 开始事务START TRANSACTION; (或 BEGIN;)
      2. 执行 SQL:执行你的 INSERT, UPDATE 等语句。
      3. 提交事务COMMIT; (所有更改永久保存)
      4. 或回滚事务ROLLBACK; (所有更改撤销)
    • 完整示例 (银行转账)

      -- 1. 关闭自动提交 (或使用 START TRANSACTION)
      SET autocommit = 0;
      -- 2. 开始一个事务块
      START TRANSACTION;
      -- 3. 执行多个操作
      UPDATE accounts SET balance = balance - 100 WHERE id = 1;
      UPDATE accounts SET balance = balance + 100 WHERE id = 2;
      -- 4. 检查结果,确认无误后提交
      COMMIT;
      -- 提交后,自动提交模式仍然是关闭的 (除非你重新 SET autocommit = 1)
      -- 你可以再次执行 START TRANSACTION 开始新事务。
      -- 如果中途发现错误,可以执行 ROLLBACK 撤销所有操作
      -- ROLLBACK;

在图形化界面工具中 (如 MySQL Workbench, DBeaver, Navicat)

这些工具提供了非常直观的事务管理界面。

  1. 开启事务:通常工具会自动为你的 SQL 查询开启一个事务,你可以在工具的底部或侧边栏看到事务的状态。
  2. 执行 SQL:在编辑器中编写并执行你的 INSERT, UPDATE 语句。
  3. 提交:你会看到一个类似 "Commit" 的按钮(通常是一个对勾 ✓ 或一个数据库图标),点击它,即可提交当前事务。
  4. 回滚:你会看到一个类似 "Rollback" 的按钮(通常是一个撤销箭头 ↩️),点击它,即可回滚当前事务的所有更改。

MySQL Workbench 示例:

在编程语言中 (如 Python, Java, PHP)

在应用程序中,你通过数据库驱动来管理事务,流程与命令行类似,但使用的是特定语言的 API。

以 Python (使用 mysql-connector-python) 为例:

import mysql.connector
from mysql.connector import Error
try:
    # 1. 建立连接
    connection = mysql.connector.connect(
        host='localhost',
        database='your_database',
        user='your_username',
        password='your_password'
    )
    if connection.is_connected():
        cursor = connection.cursor()
        # 2. 关闭自动提交 (驱动可能默认关闭,但显式设置更清晰)
        connection.autocommit = False
        # 3. 开始事务 (在 Python 中,通常不需要显式调用 START TRANSACTION)
        #   只需关闭 autocommit,后续操作就在一个事务中。
        # 4. 执行 SQL
        sql_update_query1 = "UPDATE accounts SET balance = balance - 100 WHERE id = 1"
        sql_update_query2 = "UPDATE accounts SET balance = balance + 100 WHERE id = 2"
        cursor.execute(sql_update_query1)
        cursor.execute(sql_update_query2)
        # 5. 提交事务
        connection.commit()
        print("事务已成功提交!")
except Error as e:
    # 6. 发生错误时回滚
    print(f"发生错误: {e}")
    if connection:
        connection.rollback()
        print("事务已回滚!")
finally:
    # 7. 关闭游标和连接
    if connection.is_connected():
        cursor.close()
        connection.close()
        print("MySQL 连接已关闭。")

重要概念与相关命令

命令/概念 描述
START TRANSACTION;BEGIN; 显式地开启一个新事务,它会关闭当前的自动提交模式。
COMMIT; 提交当前事务,使所有更改永久化。
ROLLBACK; 回滚当前事务,撤销所有未提交的更改。
SAVEPOINT savepoint_name; 在事务中创建一个保存点,你可以回滚到这个保存点,而不是回滚整个事务。
ROLLBACK TO savepoint_name; 回滚到指定的保存点。
SET autocommit = 0/1; 设置全局或当前会话的自动提交模式。0=关闭,=1=开启。
SHOW VARIABLES LIKE 'autocommit'; 查看当前的自动提交设置。

总结与最佳实践

  1. 明确你的模式:首先要知道你当前是处于自动提交模式还是手动事务模式,使用 SELECT @@autocommit; 查询。
  2. 数据一致性优先:对于需要“原子性”的操作(如转账、订单创建、库存扣减),务必使用手动事务(START TRANSACTION ... COMMIT/ROLLBACK),这是保证数据完整性的关键。
  3. 短事务原则:事务应尽可能短,长时间运行的事务会持有锁,降低数据库的并发性能,增加死锁的风险。
  4. 错误处理:在任何代码中操作事务时,一定要有 try...catch (或类似机制) 来捕获异常,并在出错时执行 ROLLBACK
  5. 图形化工具友好:如果你是初学者,使用图形化工具(如 MySQL Workbench)可以更直观地理解事务的提交和回滚过程。
分享:
扫描分享到社交APP
上一篇
下一篇