W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
CodeIgniter 的數(shù)據(jù)庫(kù)抽象類允許你將事務(wù)和支持事務(wù)安全表類型的數(shù)據(jù)庫(kù)一起使用。 在 MySQL 中,你需要將表設(shè)置為 InnoDB 或者 BDB 類型, 而不是更常見(jiàn)的 MyISAM。大多數(shù)的數(shù)據(jù)庫(kù)本身支持事務(wù)。
如果你不熟悉事務(wù),我們建議找個(gè)好的在線資源學(xué)習(xí)下,了解你正用的數(shù)據(jù)庫(kù)。 以下的信息假定你對(duì)事務(wù)有基本的了解。
CodeIgniter 采用一種與流行的 ADODB 數(shù)據(jù)庫(kù)類很相似的方式處理事務(wù)。 我們選用這種方法因?yàn)樗鼧O大地簡(jiǎn)化了運(yùn)行事務(wù)的過(guò)程。 在大多數(shù)情況下,所需要的只是兩行代碼。
傳統(tǒng)的事務(wù)需要相當(dāng)多的工序才能實(shí)現(xiàn),因?yàn)樗竽愀櫜樵儾⒏鶕?jù)查詢的成功或失敗來(lái)決定提交 還是回滾,這在嵌套查詢時(shí)尤為麻煩。相比之下,我們已經(jīng)實(shí)現(xiàn)了一個(gè)智能事務(wù)系統(tǒng),可以自動(dòng)為你 完成這些工作(如果你想要手動(dòng)管理你的事務(wù)也可以,但這實(shí)際上沒(méi)有任何好處)。
要使用事務(wù)運(yùn)行查詢,你將使用 $this->db->transStart() 和 $this->db->transComplete() 方法,如下所示:
$this->db->transStart();
$this->db->query('AN SQL QUERY...');
$this->db->query('ANOTHER QUERY...');
$this->db->query('AND YET ANOTHER QUERY...');
$this->db->transComplete();
你可以在啟動(dòng)/完成方法之間運(yùn)行任意多的查詢,并且根據(jù)任何給定查詢的成功或失敗結(jié)果, 他們都能被提交或回滾。
默認(rèn)情況下,CodeIgniter 以嚴(yán)格模式運(yùn)行所有事務(wù)。 啟用嚴(yán)格模式時(shí),如果你正在運(yùn)行多組事務(wù),假如一個(gè)組失敗,所有組都將被回滾。 如果禁用嚴(yán)格模式,則會(huì)獨(dú)立處理每個(gè)組,這意味著一個(gè)組的失敗不會(huì)影響其他組。
可以按如下方式禁用嚴(yán)格模式:
$this->db->transStrict(false);
如果在 Config / Database.php 文件中啟用了錯(cuò)誤報(bào)告,在提交失敗時(shí)會(huì)看到標(biāo)準(zhǔn)錯(cuò)誤消息。 如果關(guān)閉調(diào)試,你可以像下面這樣處理自己的錯(cuò)誤:
$this->db->transStart();
$this->db->query('AN SQL QUERY...');
$this->db->query('ANOTHER QUERY...');
$this->db->transComplete();
if ($this->db->transStatus() === FALSE)
{
// 生成錯(cuò)誤...或使用 log_message() 函數(shù)記錄錯(cuò)誤
}
事務(wù)功能是默認(rèn)開(kāi)啟的,如果要禁用事務(wù),可以執(zhí)行 $this->db->transOff() 操作:
$this->db->transOff();
$this->db->transStart();
$this->db->query('AN SQL QUERY...');
$this->db->transComplete();
禁用事務(wù)時(shí),你的查詢將自動(dòng)提交,就像平時(shí)沒(méi)事務(wù)那樣的執(zhí)行查詢。
你可以選擇將事務(wù)系統(tǒng)置于 “測(cè)試模式” ,這將導(dǎo)致你的查詢被回滾 – 即使查詢產(chǎn)生有效結(jié)果。要使用測(cè)試模式,只需將 $this->db->transStart() 方法的第一個(gè)參數(shù)設(shè)置為 TRUE:
$this->db->transStart(true); // 查詢將被回滾
$this->db->query('AN SQL QUERY...');
$this->db->transComplete();
如果你想手動(dòng)運(yùn)行事務(wù),可以按如下方式執(zhí)行:
$this->db->transBegin();
$this->db->query('AN SQL QUERY...');
$this->db->query('ANOTHER QUERY...');
$this->db->query('AND YET ANOTHER QUERY...');
if ($this->db->transStatus() === FALSE)
{
$this->db->transRollback();
}
else
{
$this->db->transCommit();
}
注解
確保在手動(dòng)運(yùn)行事務(wù)時(shí)使用 $this-&db-&transBegin(), 而不是 $this-&db-&transStart()。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: