2014年7月17日 星期四

MySQL AUTOCOMMIT

http://php.net/manual/pt_BR/mysqli.commit.php

1. 使用PHP mysqli
<?php
$mysqli 
= new mysqli("localhost""my_user""my_password""world");
/* check connection */if (mysqli_connect_errno()) {
    
printf("Connect failed: %s\n"mysqli_connect_error());
    exit();
}
$mysqli->query("CREATE TABLE Language LIKE CountryLanguage Type=InnoDB");
/* set autocommit to off */$mysqli->autocommit(FALSE);
/* Insert some values */$mysqli->query("INSERT INTO Language VALUES ('DEU', 'Bavarian', 'F', 11.2)");$mysqli->query("INSERT INTO Language VALUES ('DEU', 'Swabian', 'F', 9.4)");
/* commit transaction */$mysqli->commit();
/* drop table */$mysqli->query("DROP TABLE Language");
/* close connection */$mysqli->close();?>
 
 2.
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)) TYPE=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 互相 新、刪、改、查 測試.
 
 

沒有留言:

張貼留言