CodeIgniter 事務(wù)

2018-07-21 15:41 更新

事務(wù)

CodeIgniter 允許你在支持事務(wù)安全的表上使用事務(wù)。在 MySQL 中,你需要將 表的存儲引擎設(shè)置為 InnoDb 或 BDB,而不是通常我們使用的 MyISAM 。大多數(shù) 其他數(shù)據(jù)庫平臺都原生支持事務(wù)。

如果你對事務(wù)還不熟悉,我們推薦針對你正在使用的數(shù)據(jù)庫,先在網(wǎng)上尋找一些 在線資源學(xué)習(xí)一下。下面將假設(shè)你已經(jīng)明白事務(wù)的基本概念。

CodeIgniter 的事務(wù)方法

CodeIgniter 使用的事務(wù)處理方法與流行的數(shù)據(jù)庫類 ADODB 的處理方法非常相似。 我們選擇這種方式是因為它極大的簡化了事務(wù)的處理過程。大多數(shù)情況下,你只需 編寫兩行代碼就行了。

傳統(tǒng)的事務(wù)處理需要實現(xiàn)大量的工作,你必須隨時跟蹤你的查詢,并根據(jù)查詢的成功 或失敗來決定提交還是回滾。當(dāng)遇到嵌套查詢時將會更加麻煩。相比之下,我們實現(xiàn)了 一個智能的事務(wù)系統(tǒng),它將自動的為你做這些工作。(你仍然可以選擇手工管理你的 事務(wù),但這實在是沒啥好處)

運行事務(wù)

要使用事務(wù)來運行你的查詢,你可以使用 $this->db->trans_start() 和 $this->db->trans_complete() 兩個方法,像下面這樣:

$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->query('ANOTHER QUERY...');
$this->db->query('AND YET ANOTHER QUERY...');
$this->db->trans_complete();

在 start 和 complete 之間,你可以運行任意多個查詢,根據(jù)查詢執(zhí)行 成功或失敗,系統(tǒng)將自動提交或回滾。

嚴(yán)格模式 (Strict Mode)

CodeIgniter 默認(rèn)使用嚴(yán)格模式運行所有的事務(wù),在嚴(yán)格模式下,如果你正在 運行多組事務(wù),只要有一組失敗,所有組都會被回滾。如果禁用嚴(yán)格模式,那么 每一組都被視為獨立的組,這意味著其中一組失敗不會影響其他的組。

嚴(yán)格模式可以用下面的方法禁用:

$this->db->trans_strict(FALSE);

錯誤處理

如果你的數(shù)據(jù)庫配置文件 config/database.php 中啟用了錯誤報告(db_debug = TRUE), 當(dāng)提交沒有成功時,你會看到一條標(biāo)準(zhǔ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)
{
    // generate an error... or use the log_message() function to log your error
}

啟用事務(wù)

當(dāng)執(zhí)行 $this->db->trans_start() 方法時,事務(wù)將自動啟用,如果 你要禁用事務(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();

當(dāng)事務(wù)被禁用時,你的查詢會自動提交,就跟沒有使用事務(wù)一樣。

測試模式(Test Mode)

你可以選擇性的將你的事務(wù)系統(tǒng)設(shè)置為 “測試模式”,這將導(dǎo)致你的所有 查詢都被回滾,就算查詢成功執(zhí)行也一樣。要使用 “測試模式”,你只需要 將 $this->db->trans_start() 函數(shù)的第一個參數(shù)設(shè)置為 TRUE 即可:

$this->db->trans_start(TRUE); // Query will be rolled back
$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() 方法, 而不是 $this->db->trans_start() 方法。

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號