事務(wù)
CodeIgniter的數(shù)據(jù)庫抽象允許你在支持事務(wù)安全的數(shù)據(jù)庫表中使用事務(wù)。在MySQL中,你需要用InnoDB或BDB表而不是更常用的MyISAM。大多數(shù)其它的數(shù)據(jù)庫平臺都原生支持事務(wù)。
如果你對事務(wù)不熟悉,我們建議您上網(wǎng)尋找相關(guān)資源學習。以下信息假設(shè)你已經(jīng)明白事務(wù)的相關(guān)概念。
CodeIgniter 的事務(wù)方法
CodeIgniter 使用的事務(wù)方法與流行的數(shù)據(jù)庫類ADODB所使用的處理過程非常相似。我們選擇那種方法是因為它極大地簡化了運行事務(wù)的處理過程。大多數(shù)情況下你只需要編寫兩行代碼就行了。
傳統(tǒng)上, 事務(wù)需要實現(xiàn)大量工作, 他們要求你隨時跟蹤你的查詢, 并根據(jù)查詢的成功或失敗來決定 提交 還是 回滾。這是特別麻煩的嵌套查詢。相比之下, 我們實現(xiàn)了一種智能的事務(wù)系統(tǒng), 它將自動地為你做這些事情(如果你選擇手動管理你的事務(wù), 這也是可以的, 但這確實沒什么好處)。
運行事務(wù)
要使用事務(wù)來運行你的查詢, 你可以使用如下所述的 $this->db->trans_start() 和 $this->db->trans_complete() 函數(shù):
$this->db->trans_start();
$this->db->query('一條SQL查詢...');
$this->db->query('另一條查詢...');
$this->db->query('還有一條查詢...');
$this->db->trans_complete();
在 start/complete 函數(shù)之間, 你想運行多少條查詢都可以, 根據(jù)任何給定查詢的成功或失敗, 它們將被提交或者回滾。
嚴格模式(Strict Mode)
默認情況下, CodeIgniter 以嚴格模式運行所有事務(wù)。當嚴格模式被啟用時, 如果你正在運行多組的事務(wù), 只要有一組失敗, 所有組都會被回滾。如果嚴格模式被禁用, 每一組都被視為獨立的組, 這意味著其中一個組的失敗不會影響其它組。
嚴格模式能以下面的方式禁用:
$this->db->trans_strict(FALSE);
管理錯誤信息
如果你在你的 config/database.php 文件中啟用了錯誤報告, 當提交沒有成功時, 你會看到一條標準的錯誤信息。如果調(diào)試被關(guān)閉, 你可以通過這種方式來管理你的錯誤信息:
$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)
{
????// 生成一條錯誤信息... 或者使用 log_message() 函數(shù)來記錄你的錯誤信息
}
禁用事務(wù)
當你使用 $this->db->trans_start() 時, 事務(wù)就已經(jīng)被自動啟用了。如果你想要禁用事務(wù), 你可以使用 $this->db->trans_off() 來實現(xiàn):
$this->db->trans_off()
$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->trans_complete();
當事務(wù)被禁用的時候, 你的查詢將被自動提交, 就像沒有使用事務(wù)時那樣。
測試模式(Test Mode)
你可以選擇性地將事務(wù)系統(tǒng)設(shè)置到 "測試模式" , 這將導(dǎo)致你的查詢被回滾 -- 盡管查詢會生成有效結(jié)果。要使用測試模式, 只需將 $this->db->trans_start() 函數(shù)的第一個參數(shù)設(shè)置為 TRUE 即可:
$this->db->trans_start(TRUE); // 查詢將被回滾
$this->db->query('AN SQL QUERY...');
$this->db->trans_complete();
手動運行事務(wù)
如果你想要手動運行事務(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ù)時, 請務(wù)必使用 $this->db->trans_begin() 函數(shù), 而不是 $this->db->trans_start().
?