CodeIgniter4 事務(wù)

2020-08-14 11:38 更新

CodeIgniter 的數(shù)據(jù)庫抽象類允許你將事務(wù)和支持事務(wù)安全表類型的數(shù)據(jù)庫一起使用。 在 MySQL 中,你需要將表設(shè)置為 InnoDB 或者 BDB 類型, 而不是更常見的 MyISAM。大多數(shù)的數(shù)據(jù)庫本身支持事務(wù)。

如果你不熟悉事務(wù),我們建議找個好的在線資源學(xué)習(xí)下,了解你正用的數(shù)據(jù)庫。 以下的信息假定你對事務(wù)有基本的了解。

CodeIgniter 的事務(wù)方法

CodeIgniter 采用一種與流行的 ADODB 數(shù)據(jù)庫類很相似的方式處理事務(wù)。 我們選用這種方法因為它極大地簡化了運行事務(wù)的過程。 在大多數(shù)情況下,所需要的只是兩行代碼。

傳統(tǒng)的事務(wù)需要相當(dāng)多的工序才能實現(xiàn),因為它要求你跟蹤查詢并根據(jù)查詢的成功或失敗來決定提交 還是回滾,這在嵌套查詢時尤為麻煩。相比之下,我們已經(jīng)實現(xiàn)了一個智能事務(wù)系統(tǒng),可以自動為你 完成這些工作(如果你想要手動管理你的事務(wù)也可以,但這實際上沒有任何好處)。

運行事務(wù)

要使用事務(wù)運行查詢,你將使用 $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();

你可以在啟動/完成方法之間運行任意多的查詢,并且根據(jù)任何給定查詢的成功或失敗結(jié)果, 他們都能被提交或回滾。

嚴(yán)格模式

默認(rèn)情況下,CodeIgniter 以嚴(yán)格模式運行所有事務(wù)。 啟用嚴(yán)格模式時,如果你正在運行多組事務(wù),假如一個組失敗,所有組都將被回滾。 如果禁用嚴(yán)格模式,則會獨立處理每個組,這意味著一個組的失敗不會影響其他組。

可以按如下方式禁用嚴(yán)格模式:

$this->db->transStrict(false);

錯誤處理

如果在 Config / Database.php 文件中啟用了錯誤報告,在提交失敗時會看到標(biāo)準(zhǔn)錯誤消息。 如果關(guān)閉調(diào)試,你可以像下面這樣處理自己的錯誤:

$this->db->transStart();
$this->db->query('AN SQL QUERY...');
$this->db->query('ANOTHER QUERY...');
$this->db->transComplete();


if ($this->db->transStatus() === FALSE)
{
        // 生成錯誤...或使用 log_message() 函數(shù)記錄錯誤
}

禁用事務(wù)

事務(wù)功能是默認(rèn)開啟的,如果要禁用事務(wù),可以執(zhí)行 $this->db->transOff() 操作:

$this->db->transOff();


$this->db->transStart();
$this->db->query('AN SQL QUERY...');
$this->db->transComplete();

禁用事務(wù)時,你的查詢將自動提交,就像平時沒事務(wù)那樣的執(zhí)行查詢。

測試模式

你可以選擇將事務(wù)系統(tǒng)置于 “測試模式” ,這將導(dǎo)致你的查詢被回滾 – 即使查詢產(chǎn)生有效結(jié)果。要使用測試模式,只需將 $this->db->transStart() 方法的第一個參數(shù)設(shè)置為 TRUE:

$this->db->transStart(true); // 查詢將被回滾
$this->db->query('AN SQL QUERY...');
$this->db->transComplete();

手動運行事務(wù)

如果你想手動運行事務(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();
}

注解

確保在手動運行事務(wù)時使用 $this-&db-&transBegin(), 而不是 $this-&db-&transStart()。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號