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