當前位置:才華齋>計算機>php語言>

PHP mysql 事務處理例項

php語言 閱讀(9.61K)

PHP是當今最熱門的計算機語言,以下是本站小編精心為大家整理的PHP教程,希望對大家學習PHP有所幫助!更多內容請關注應屆畢業生網!

PHP mysql 事務處理例項

事務是必須滿足4個條件(ACID):原子性(Autmic)、一致性(Consistency)、隔離性(Isolation)、永續性(Durability)

 原子性(Autmic):事務在執行性,要做到“要麼不做,要麼全做!”,就是說不允許事務部分得執行。即使因為故障而使事務不能完成,在rollback時也要消除對資料庫得影響!

  一致性(Consistency):事務得操作應該使使資料庫從一個一致狀態轉變倒另一個一致得狀態!就拿網上購物來說吧,你只有即讓商品出庫,又讓商品進入顧客得購物籃才能構成事務!

 隔離性(Isolation):如果多個事務併發執行,應象各個事務獨立執行一樣!

永續性(Durability):一個成功執行得事務對資料庫得作用是持久得,即使資料庫應故障出錯,也應該能夠恢復!

  MYSQL的事務處理主要有兩種方法。

  1、用begin,rollback,commit來實現

begin 開始一個事務

rollback 事務回滾

commit 事務確認

rollback和commit不能並列使用,當你同時使用,只有前面的一個有效,而後面的無效,即是你或執行commit或執行rollback

  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:appservmysql檔案,找到skip-InnoDB,在前面加上#,後儲存檔案。

2.在執行中輸入:,重啟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;來改變資料表的引擎以支援事務。

例項一.

1234567891011121314151617$conn=mysql_connect('localhost','root','root')ordie("資料連線錯誤!!!");mysql_select_db('test',$conn);mysql_query("setnames'GBK'");//使用GBK中文編碼;//開始一個事務mysql_query("BEGIN");//或者mysql_query("STARTTRANSACTION");$sql="INSERTINTO`user`(`id`,`username`,`sex`)VALUES(NULL,'test1','0')";$sql2="INSERTINTO`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");

例項二

12345678910111213mysql_query("SETAUTOCOMMIT=0");//設定mysql不自動提交,需自行用commit語句提交$sql="INSERTINTO`user`(`id`,`username`,`sex`)VALUES(NULL,'test1','0')";$sql2="INSERTINTO`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("SETAUTOCOMMIT=1");自動提交

對於不支援事務的'MyISAM引擎資料庫可以使用表鎖定的方法

//MyISAM & InnoDB 都支援,

/*

LOCK TABLES可以鎖定用於當前執行緒的表。如果表被其它執行緒鎖定,則造成堵塞,直到可以獲取所有鎖定為止。

UNLOCK TABLES可以釋放被當前執行緒保持的任何鎖定。當執行緒釋出另一個LOCK TABLES時,或當與伺服器的連線被關閉時,所有由當前執行緒鎖定的表被隱含地解鎖。

*/

123456789mysql_query("LOCKTABLES`user`WRITE");//鎖住`user`表$sql="INSERTINTO`user`(`id`,`username`,`sex`)VALUES(NULL,'test1','0')";$res=mysql_query($sql);if($res){echo'提交成功。!';}else{echo'失敗!';}mysql_query("UNLOCKTABLES");//解除鎖定