abstract:本文實例講述了PHP操作MySQL事務的方法,分享給大家供大家參考。具體方法如下:一般來說,事務都應該具備ACID特征。所謂ACID是Atomic(原子性),Consistent(一致性),Isolated(隔離性),Durable(持續(xù)性)四個詞的首字母所寫,下面以“銀行轉帳”為例來分別說明一下它們的含義:① 原子性:組成事務處理的語句形成了一個邏輯單元,不能只執(zhí)行其中的一部分。換句話說,事務是
本文實例講述了PHP操作MySQL事務的方法,分享給大家供大家參考。具體方法如下:
一般來說,事務都應該具備ACID特征。所謂ACID是Atomic(原子性),Consistent(一致性),Isolated(隔離性),Durable(持續(xù)性)四個詞的首字母所寫,下面以“銀行轉帳”為例來分別說明一下它們的含義:
① 原子性:組成事務處理的語句形成了一個邏輯單元,不能只執(zhí)行其中的一部分。換句話說,事務是不可分割的最小單元。比如:銀行轉帳過程中,必須同時從一個帳戶減去轉帳金額,并加到另一個帳戶中,只改變一個帳戶是不合理的。
② 一致性:在事務處理執(zhí)行前后,數(shù)據(jù)庫是一致的。也就是說,事務應該正確的轉換系統(tǒng)狀態(tài)。比如:銀行轉帳過程中,要么轉帳金額從一個帳戶轉入另一個帳戶,要么兩個帳戶都不變,沒有其他的情況。
③ 隔離性:一個事務處理對另一個事務處理沒有影響。就是說任何事務都不可能看到一個處在不完整狀態(tài)下的事務。比如說,銀行轉帳過程中,在轉帳事務沒有提交之前,另一個轉帳事務只能處于等待狀態(tài)。
④ 持續(xù)性:事務處理的效果能夠被永久保存下來。反過來說,事務應當能夠承受所有的失敗,包括服務器、進程、通信以及媒體失敗等等。比如:銀行轉帳過程中,轉帳后帳戶的狀態(tài)要能被保存下來。
在PHP中,mysqli 已經(jīng)很好的封裝了mysql事務的相關操作。如下示例:
$sql1 = "UPDATE User set ScoreCount = ScoreCount +10 where ID= '123456'"; $sql2 = "UPDATE ScoreDetail set FScore = 300 where ID= '123456'"; $sql3 = "INSERT into ScoreDetail ID,Score) values ('123456',60)"; $mysqli = new mysqli('localhost','root','','DB_Lib2Test'); $mysqli->autocommit(false);//開始事物 $mysqli->query($sql1); $mysqli->query($sql2); if(!$mysqli->errno){ $mysqli->commit(); echo 'ok'; }else{ echo 'err'; $mysqli->rollback(); }
在這里,我們再使用 php mysql 系列函數(shù)執(zhí)行事務。
$sql1 = "UPDATE User set ScoreCount = ScoreCount +10 where ID= '123456'"; $sql2 = "UPDATE ScoreDetail set FScore = 300 where ID= '123456'"; $sql3 = "INSERT into ScoreDetail ID,Score) values ('123456',60)"; $conn = mysql_connect('localhost','root',''); mysql_SELECT_db('DB_Lib2Test'); mysql_query('start transaction'); //mysql_query('SET autocommit=0'); mysql_query($sql1); mysql_query($sql2); if(mysql_errno ()){ mysql_query('rollback'); echo 'err'; }else{ mysql_query('commit'); echo 'ok'; } // mysql_query('SET autocommit=1'); // mysql_query($sql3);
在這里要注意:
MyISAM:不支持事務,用于只讀程序提高性能
InnoDB:支持ACID事務、行級鎖、并發(fā)
Berkeley DB:支持事務
更多關于php操作MySQL事務實例請關注PHP中文網(wǎng)(www.miracleart.cn)其他文章!