CodeIgniter4 事務(wù)

2020-08-14 11:38 更新

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 的事務(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)有任何好處)。

運(yùn)行事務(wù)

要使用事務(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é)果, 他們都能被提交或回滾。

嚴(yán)格模式

默認(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);

錯(cuò)誤處理

如果在 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ù)

事務(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í)行查詢。

測(cè)試模式

你可以選擇將事務(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ù)

如果你想手動(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()。

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)