十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
現(xiàn)在是一個(gè)電商時(shí)代,做電商的首先得有一個(gè)商城,所以商城的安全也是不容忽視的,一個(gè)數(shù)據(jù)安全的商城離不開(kāi)數(shù)據(jù)庫(kù)的事務(wù)處理,商城在資金、商品、下單、結(jié)賬等重要步驟加上事務(wù)控制這是不一定不可少的,像市場(chǎng)上的一些開(kāi)源商城我都有去研究。
程序員獨(dú)立開(kāi)發(fā)商城也要注意這方面的事情,現(xiàn)在我這邊就介紹下PHP操作MySQL事務(wù)的方法,分享給大家供大家參考。具體方法如下:
一般來(lái)說(shuō),事務(wù)都應(yīng)該具備ACID特征。所謂ACID是Atomic(原子性),Consistent(一致性),Isolated(隔離性),Durable(持續(xù)性)四個(gè)詞的首字母所寫,下面以“銀行轉(zhuǎn)帳”為例來(lái)分別說(shuō)明一下它們的含義:
① 原子性:組成事務(wù)處理的語(yǔ)句形成了一個(gè)邏輯單元,不能只執(zhí)行其中的一部分。換句話說(shuō),事務(wù)是不可分割的最小單元。比如:銀行轉(zhuǎn)帳過(guò)程中,必須同時(shí)從一個(gè)帳戶減去轉(zhuǎn)帳金額,并加到另一個(gè)帳戶中,只改變一個(gè)帳戶是不合理的。
② 一致性:在事務(wù)處理執(zhí)行前后,數(shù)據(jù)庫(kù)是一致的。也就是說(shuō),事務(wù)應(yīng)該正確的轉(zhuǎn)換系統(tǒng)狀態(tài)。比如:銀行轉(zhuǎn)帳過(guò)程中,要么轉(zhuǎn)帳金額從一個(gè)帳戶轉(zhuǎn)入另一個(gè)帳戶,要么兩個(gè)帳戶都不變,沒(méi)有其他的情況。
③ 隔離性:一個(gè)事務(wù)處理對(duì)另一個(gè)事務(wù)處理沒(méi)有影響。就是說(shuō)任何事務(wù)都不可能看到一個(gè)處在不完整狀態(tài)下的事務(wù)。比如說(shuō),銀行轉(zhuǎn)帳過(guò)程中,在轉(zhuǎn)帳事務(wù)沒(méi)有提交之前,另一個(gè)轉(zhuǎn)帳事務(wù)只能處于等待狀態(tài)。
④ 持續(xù)性:事務(wù)處理的效果能夠被永久保存下來(lái)。反過(guò)來(lái)說(shuō),事務(wù)應(yīng)當(dāng)能夠承受所有的失敗,包括服務(wù)器、進(jìn)程、通信以及媒體失敗等等。比如:銀行轉(zhuǎn)帳過(guò)程中,轉(zhuǎn)帳后帳戶的狀態(tài)要能被保存下來(lái)。
在PHP中,mysqli 已經(jīng)很好的封裝了mysql事務(wù)的相關(guān)操作。如下示例:
$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);//開(kāi)始事物
$mysqli->query($sql1);
$mysqli->query($sql2);
if(!$mysqli->errno){
? $mysqli->commit();
? echo 'ok';
}else{
?echo 'err';
? $mysqli->rollback();
}
在這里,我們?cè)偈褂?php mysql 系列函數(shù)執(zhí)行事務(wù)。
$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);
成都創(chuàng)新互聯(lián)長(zhǎng)期為上1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為瑪多企業(yè)提供專業(yè)的網(wǎng)站制作、網(wǎng)站設(shè)計(jì),瑪多網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。