?
本文檔使用 php中文網(wǎng)手冊 發(fā)布
CodeIgniter的數(shù)據(jù)庫抽象允許您將事務(wù)與支持事務(wù)安全表類型的數(shù)據(jù)庫一起使用。在MySQL中,您需要運行InnoDB或BDB表類型,而不是更常見的MyISAM。大多數(shù)其他數(shù)據(jù)庫平臺本機支持事務(wù)。
如果您不熟悉事務(wù),我們建議您找到一個很好的在線資源來了解您的特定數(shù)據(jù)庫。下面的信息假設(shè)您對事務(wù)有基本的理解。
CodeIgniter使用一種與流行的數(shù)據(jù)庫類ADODB所使用的進程非常相似的事務(wù)處理方法。我們之所以選擇這種方法,是因為它極大地簡化了運行事務(wù)的過程。在大多數(shù)情況下,所需的只是兩行代碼。
傳統(tǒng)上,事務(wù)需要執(zhí)行相當數(shù)量的工作,因為它們要求您跟蹤查詢并根據(jù)查詢的成功或失敗確定是提交還是回滾。這對于嵌套查詢尤其麻煩。相反,我們已經(jīng)實施了一個智能交易系統(tǒng),可以自動完成所有這些工作(如果您愿意,也可以手動管理您的交易,但實際上沒有任何好處)。
要使用事務(wù)運行查詢,您將使用$ 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();
您可以在開始函數(shù)/完成函數(shù)之間運行任意數(shù)量的查詢,這些查詢都將根據(jù)任何給定查詢的成功或失敗被提交或回滾。
默認情況下,CodeIgniter以嚴格模式運行所有事務(wù)。啟用嚴格模式時,如果您正在運行多組事務(wù),如果一個組失敗,所有組都將回滾。如果禁用嚴格模式,則每個組將被獨立處理,這意味著一個組的失敗不會影響其他組。
嚴格模式可以禁用如下:
$this->db->trans_strict(FALSE);
如果在config/database.php文件中啟用了錯誤報告,如果提交失敗,您將看到一個標準錯誤消息。如果關(guān)閉調(diào)試,您可以管理自己的錯誤,如下所示:
$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();
當事務(wù)被禁用時,您的查詢將自動提交,就像在沒有事務(wù)的情況下運行查詢時一樣,實際上忽略了對trans_start()
,,,trans_complete()
等
您可以選擇將交易系統(tǒng)置于“測試模式”,這將導(dǎo)致您的查詢被回滾 - 即使查詢產(chǎn)生了有效的結(jié)果。要使用測試模式,只需將$ this-> db-> trans_start()函數(shù)中的第一個參數(shù)設(shè)置為TRUE:
$this->db->trans_start(TRUE); // Query will be rolled back$this->db->query('AN SQL QUERY...');$this->db->trans_complete();
如果您想手動運行事務(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(); }
注
確保在運行手動事務(wù)時使用$ this-> db-> trans_begin(),而不是 $ this-> db-> trans_start()。