W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
CodeIgniter 允許你在支持事務安全的表上使用事務。在 MySQL 中,你需要將 表的存儲引擎設置為 InnoDb 或 BDB,而不是通常我們使用的 MyISAM 。大多數(shù) 其他數(shù)據(jù)庫平臺都原生支持事務。
如果你對事務還不熟悉,我們推薦針對你正在使用的數(shù)據(jù)庫,先在網(wǎng)上尋找一些 在線資源學習一下。下面將假設你已經(jīng)明白事務的基本概念。
CodeIgniter 使用的事務處理方法與流行的數(shù)據(jù)庫類 ADODB 的處理方法非常相似。 我們選擇這種方式是因為它極大的簡化了事務的處理過程。大多數(shù)情況下,你只需 編寫兩行代碼就行了。
傳統(tǒng)的事務處理需要實現(xiàn)大量的工作,你必須隨時跟蹤你的查詢,并根據(jù)查詢的成功 或失敗來決定提交還是回滾。當遇到嵌套查詢時將會更加麻煩。相比之下,我們實現(xiàn)了 一個智能的事務系統(tǒng),它將自動的為你做這些工作。(你仍然可以選擇手工管理你的 事務,但這實在是沒啥好處)
要使用事務來運行你的查詢,你可以使用 $this->db->trans_start() 和 $this->db->trans_complete() 兩個方法,像下面這樣:
$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();
在 start 和 complete 之間,你可以運行任意多個查詢,根據(jù)查詢執(zhí)行 成功或失敗,系統(tǒng)將自動提交或回滾。
CodeIgniter 默認使用嚴格模式運行所有的事務,在嚴格模式下,如果你正在 運行多組事務,只要有一組失敗,所有組都會被回滾。如果禁用嚴格模式,那么 每一組都被視為獨立的組,這意味著其中一組失敗不會影響其他的組。
嚴格模式可以用下面的方法禁用:
$this->db->trans_strict(FALSE);
如果你的數(shù)據(jù)庫配置文件 config/database.php 中啟用了錯誤報告(db_debug = TRUE), 當提交沒有成功時,你會看到一條標準的錯誤信息。如果沒有啟用錯誤報告, 你可以像下面這樣來管理你的錯誤:
$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
}
當執(zhí)行 $this->db->trans_start() 方法時,事務將自動啟用,如果 你要禁用事務,可以使用 $this->db->trans_off() 方法來實現(xiàn):
$this->db->trans_off();
$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->trans_complete();
當事務被禁用時,你的查詢會自動提交,就跟沒有使用事務一樣。
你可以選擇性的將你的事務系統(tǒng)設置為 “測試模式”,這將導致你的所有 查詢都被回滾,就算查詢成功執(zhí)行也一樣。要使用 “測試模式”,你只需要 將 $this->db->trans_start() 函數(shù)的第一個參數(shù)設置為 TRUE 即可:
$this->db->trans_start(TRUE); // Query will be rolled back
$this->db->query('AN SQL QUERY...');
$this->db->trans_complete();
如果你想手工運行事務,可以像下面這樣做:
$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();
}
注解
手動運行事務時,請務必使用 $this->db->trans_begin() 方法, 而不是 $this->db->trans_start() 方法。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: