2011年10月5日 星期三

PHP 對 MYSQL 交易(Transaction)

MYSQL 中只有 INNODB 和 BDB 類型的資料表才能執行交易處理!一般 MYSQL 資料庫預設的引擎是 MyISAM,這種引擎不能執行交易!如果要讓 MYSQL 執行交易,可以自己手動修改:

方法如下(Windows):
1.修改 c:\appserv\mysql\my.ini 文件,找到 skip-InnoDB ,在前面加上#,後存檔。
2.在執行中輸入:services.msc,重啟 mysql服務。
3.到 phpmyadmin 中,mysql->show engines;(或執行mysql->show variables like 'have_%'; ),查看 InnoDB 為 YES,即表示資料庫執行 InnoDB 了。也就說明能執行交易 Transaction 了。
4.在建資料表時,就可以為S torage Engine 選擇 InnoDB 引擎了。如果是以前建的,可以使用 mysql->alter table table_name type=InnoDB; 或 mysql->alter table table_name engine=InnoDB; 來改變資料表的引擎。
MySQL 預設都會啟動 Auto Commit, 要在 InnoDB 做 Transaction 有分兩種方法:
1. begin 直到 commit, rollback 結束
2. set autocommit=0 直到 set autocommit=1 結束




/*方法一*/

//若不使用交易,則 $sql 執行成功,$sql1 執行失敗
$sql = " insert into test values('11','88') ";
$sql1 = " insert into test values('11','88','444') ";
$res = mysql_query($sql);
$res1 = mysql_query($sql1);
//因爲使用了交易,則兩個 insert 都執行失敗
if($res && $res1){
mysql_query("COMMIT");
}else{
mysql_query("ROLLBACK");
}

/*方法二*/

mysql_query("SET AUTOCOMMIT=0"); //設置 mysql 不自動執行,需自行用 commit 語句執行
$sql = " insert into test values('11','88') ";
$sql1 = " insert into test values('11','88','444') ";
$res = mysql_query($sql);
$res1 = mysql_query($sql1);
//因爲使用了交易,則兩個 insert 都執行失敗
if($res && $res1){
mysql_query("COMMIT");
}else{
mysql_query("ROLLBACK");
}

/*方法三*/

//對於不支援事務的 MyISAM 引擎數據庫可以使用表鎖定的方法:
//MyISAM & InnoDB 都支援,
//Notes:query 語句不能寫在一起如:mysql_query("select * from a;select * from b;");
$sql_1=" LOCK TABLES test WRITE ";
mysql_query($sql_1);

$sql_2=" INSERT INTO test VALUES('".$a."','".$b."') ";
if(mysql_query($sql_2)){
echo 'successful!';
}else{
echo 'Unsuccessful!';
}
$sql_3=" UNLOCK TABLES ";
mysql_query($sql_3);


以上轉載自:http://chair.twgg.org/2010/03/php-mysql-transaction.html

沒有留言:

張貼留言

Google Analytics初學者入門簡介