MySQL InnoDB 的 Transaction 的簡易用法

MySQL 預設都會啟動 Auto Commit, 要在 InnoDB 做 Transaction 有分兩種方法:

  1. BEGIN 直到 COMMIT, ROLLBACK 結束
  2. SET AUTOCOMMIT=0 直到 SET AUTOCOMMIT=1 結束

兩者差別在於:

  1. 使用 BEGIN 是當下的做 Transaction 的功能, 一直到 COMMIT 或 ROLLBACK 為止.(之後一樣是會 AUTO COMMIT)
  2. 使用 SET AUTOCOMMIT 的話, 只要設 0 就是 "在這次的 Connection" 都當做 AUTOCOMMIT是關閉的, 不管做幾次 COMMIT, ROLLBACK 都一樣, 直到設為 1 才算開啟 AUTO COMMIT.

不過以上的方法, 都要小心是否要做 Read Lock 的問題.

Test:

CREATE DATABASE innodb_test;
CREATE TABLE customers(a int, b char(20), index(a)) ENGINE=InnoDB;

# 看 table 的狀態
SHOW TABLE STATUS FROM innodb_test LIKE 'customers'\G;

# BEGIN 的方法
BEGIN;
INSERT INTO customers VALUES(10, 'abc');
COMMIT;   # 此 BEGIN Transaction 已在此結束
SELECT * FROM customers;
INSERT INTO customers VALUES(11, 'aaa');
ROLLBACK;  # 此命令是無作用的, 已經不在 BEGIN 的範圍了, 資料會自動 COMMIT 進去.
SELECT * FROM customers;

# SET AUTOCOMMIT 的方法
# (注意: 其它 Connection 並不會因為這 Connection 設定而不 自動COMMIT)
SET AUTOCOMMIT=0;
INSERT INTO customers VALUES(15, 'def');
ROLLBACK;
INSERT INTO customers VALUES(16, 'ggg');
COMMIT;
SELECT * FROM customers;

# 回復每筆交易都會自動 COMMIT 的狀態
SET AUTOCOMMIT=1;

以上最好可以開兩個 Connection 互相 新、刪、改、查 測試.

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

在〈MySQL InnoDB 的 Transaction 的簡易用法〉中有 2 則留言

  1. mysql> CREATE TABLE customers(a int, b char(20), index(a)) TYPE=InnoDB;
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'TYPE=InnoDB' at line 1
    是不是要改成
    mysql> CREATE TABLE customers(a int, b char(20), index(a)) ENGINE=InnoDB;
    才對呢?

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料