?php$db = new mysqli( localhost , root , , test //連接數據庫$db- autocommit(false); //設置為非自動提交——事務處理$sql1 = INSERT INTO `test`.`test1` (`name` )VALUES ( 1 ) $result1 = $db- query($sql1);$sql2 = INSERT INTO `test`.`test2` (`a` )VALUES ( 1 ) $result2 = $db- query($sql2);if ($result1 $result2) {$db- commit(); //全部成功,提交執行結果echo 提交 } else {$db- rollback(); //有任何錯誤發生,回滾并取消執行結果echo 回滾 $db- autocommit(true); //設置為非自動提交——事務處理$db- close();?
MYSQL的事務處理主要有兩種方法。
1、用begin,rollback,commit來實現
begin 開始一個事務
rollback 事務回滾
commit 事務確認
2、直接用set來改變mysql的自動提交模式
MYSQL默認是自動提交的,也就是你提交一個QUERY,它就直接執行!我們可以通過
set autocommit=0 禁止自動提交
set autocommit=1 開啟自動提交
來實現事務的處理。
當你用 set autocommit=0 的時候,你以后所有的SQL都將做為事務處理,直到你用commit確認或rollback結束。
注意當你結束這個事務的同時也開啟了個新的事務!按第一種方法只將當前的作為一個事務!
個人推薦使用第一種方法!
MYSQL中只有INNODB和BDB類型的數據表才能支持事務處理!其他的類型是不支持的!
***:一般MYSQL數據庫默認的引擎是MyISAM,這種引擎不支持事務!如果要讓MYSQL支持事務,可以自己手動修改:
方法如下:
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.在創建表時,就可以為Storage Engine選擇InnoDB引擎了。如果是以前創建的表,可以使用mysql- alter table table_name type=InnoDB;
或 mysql- alter table table_name engine=InnoDB;來改變數據表的引擎以支持事務。
*/
/*************** transaction--1 ***************/$conn = mysql_connect( localhost , root , root ) or die ( 數據連接錯誤!!! mysql_select_db( test ,$conn);mysql_query( set names GBK //使用GBK中文編碼;//開始一個事務mysql_query( BEGIN //或者mysql_query( START TRANSACTION $sql = INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, test1 , 0 ) $sql2 = INSERT INTO `user` (`did`, `username`, `sex`) VALUES (NULL, test1 , 0 ) //這條我故意寫錯$res = mysql_query($sql);$res1 = mysql_query($sql2); if($res $res1){mysql_query( COMMIT echo 提交成功。 }else{mysql_query( ROLLBACK echo 數據回滾。 mysql_query( END
/**************** transaction--2 *******************//*方法二*/mysql_query( SET AUTOCOMMIT=0 //設置mysql不自動提交,需自行用commit語句提交$sql = INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, test1 , 0 ) $sql2 = INSERT INTO `user` (`did`, `username`, `sex`) VALUES (NULL, test1 , 0 ) //這條我故意寫錯$res = mysql_query($sql);$res1 = mysql_query($sql2); if($res $res1){mysql_query( COMMIT echo 提交成功。 }else{mysql_query( ROLLBACK echo 數據回滾。 mysql_query( END //事務處理完時別忘記mysql_query( SET AUTOCOMMIT=1 自動提交
/******************對于不支持事務的MyISAM引擎數據庫可以使用表鎖定的方法:********************///MyISAM InnoDB 都支持,LOCK TABLES可以鎖定用于當前線程的表。如果表被其它線程鎖定,則造成堵塞,直到可以獲取所有鎖定為止。UNLOCK TABLES可以釋放被當前線程保持的任何鎖定。當線程發布另一個LOCK TABLES時,或當與服務器的連接被關閉時,所有由當前線程鎖定的表被隱含地解鎖。mysql_query( LOCK TABLES `user` WRITE //鎖住`user`表$sql = INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, test1 , 0 ) $res = mysql_query($sql);if($res){echo 提交成功。! }else{echo 失敗! mysql_query( UNLOCK TABLES //解除鎖定
以上就是php事務的實現方法介紹(代碼示例)的詳細內容,PHP教程
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答