?
Dieses Dokument verwendet PHP-Handbuch für chinesische Websites Freigeben
CodeIgniter的數(shù)據(jù)庫(kù)抽象允許您將事務(wù)與支持事務(wù)安全表類(lèi)型的數(shù)據(jù)庫(kù)一起使用。在MySQL中,您需要運(yùn)行InnoDB或BDB表類(lèi)型,而不是更常見(jiàn)的MyISAM。大多數(shù)其他數(shù)據(jù)庫(kù)平臺(tái)本機(jī)支持事務(wù)。
如果您不熟悉事務(wù),我們建議您找到一個(gè)很好的在線(xiàn)資源來(lái)了解您的特定數(shù)據(jù)庫(kù)。下面的信息假設(shè)您對(duì)事務(wù)有基本的理解。
CodeIgniter使用一種與流行的數(shù)據(jù)庫(kù)類(lèi)ADODB所使用的進(jìn)程非常相似的事務(wù)處理方法。我們之所以選擇這種方法,是因?yàn)樗鼧O大地簡(jiǎn)化了運(yùn)行事務(wù)的過(guò)程。在大多數(shù)情況下,所需的只是兩行代碼。
傳統(tǒng)上,事務(wù)需要執(zhí)行相當(dāng)數(shù)量的工作,因?yàn)樗鼈円竽櫜樵?xún)并根據(jù)查詢(xún)的成功或失敗確定是提交還是回滾。這對(duì)于嵌套查詢(xún)尤其麻煩。相反,我們已經(jīng)實(shí)施了一個(gè)智能交易系統(tǒng),可以自動(dòng)完成所有這些工作(如果您愿意,也可以手動(dòng)管理您的交易,但實(shí)際上沒(méi)有任何好處)。
要使用事務(wù)運(yùn)行查詢(xún),您將使用$ this-> db-> trans_start()和$ this-> db-> trans_complete()函數(shù),如下所示:
$this->db->trans_start();$this->db->query('AN SQL QUERY...');$this->db->query('ANOTHER QUERY...');$this->db->query('AND YET ANOTHER QUERY...');$this->db->trans_complete();
您可以在開(kāi)始函數(shù)/完成函數(shù)之間運(yùn)行任意數(shù)量的查詢(xún),這些查詢(xún)都將根據(jù)任何給定查詢(xún)的成功或失敗被提交或回滾。
默認(rèn)情況下,CodeIgniter以嚴(yán)格模式運(yùn)行所有事務(wù)。啟用嚴(yán)格模式時(shí),如果您正在運(yùn)行多組事務(wù),如果一個(gè)組失敗,所有組都將回滾。如果禁用嚴(yán)格模式,則每個(gè)組將被獨(dú)立處理,這意味著一個(gè)組的失敗不會(huì)影響其他組。
嚴(yán)格模式可以禁用如下:
$this->db->trans_strict(FALSE);
如果在config/database.php文件中啟用了錯(cuò)誤報(bào)告,如果提交失敗,您將看到一個(gè)標(biāo)準(zhǔn)錯(cuò)誤消息。如果關(guān)閉調(diào)試,您可以管理自己的錯(cuò)誤,如下所示:
$this->db->trans_start(); $this->db->query('AN SQL QUERY...'); $this->db->query('ANOTHER QUERY...'); $this->db->trans_complete(); if ($this->db->trans_status() === FALSE){ // generate an error... or use the log_message() function to log your error}
如果希望禁用事務(wù),可以使用$this->db->trans_off()
*
$this->db->trans_off();$this->db->trans_start();$this->db->query('AN SQL QUERY...');$this->db->trans_complete();
當(dāng)事務(wù)被禁用時(shí),您的查詢(xún)將自動(dòng)提交,就像在沒(méi)有事務(wù)的情況下運(yùn)行查詢(xún)時(shí)一樣,實(shí)際上忽略了對(duì)trans_start()
,,,trans_complete()
等
您可以選擇將交易系統(tǒng)置于“測(cè)試模式”,這將導(dǎo)致您的查詢(xún)被回滾 - 即使查詢(xún)產(chǎn)生了有效的結(jié)果。要使用測(cè)試模式,只需將$ this-> db-> trans_start()函數(shù)中的第一個(gè)參數(shù)設(shè)置為T(mén)RUE:
$this->db->trans_start(TRUE); // Query will be rolled back$this->db->query('AN SQL QUERY...');$this->db->trans_complete();
如果您想手動(dòng)運(yùn)行事務(wù),可以這樣做:
$this->db->trans_begin();$this->db->query('AN SQL QUERY...'); $this->db->query('ANOTHER QUERY...'); $this->db->query('AND YET ANOTHER QUERY...'); if ($this->db->trans_status() === FALSE){ $this->db->trans_rollback();}else{ $this->db->trans_commit(); }
注
確保在運(yùn)行手動(dòng)事務(wù)時(shí)使用$ this-> db-> trans_begin(),而不是 $ this-> db-> trans_start()。