# 事務
CodeIgniter 允許你在支持事務安全的表上使用事務。在 MySQL 中,你需要將 表的存儲引擎設置為 InnoDb 或 BDB,而不是通常我們使用的 MyISAM 。大多數 其他數據庫平臺都原生支持事務。
如果你對事務還不熟悉,我們推薦針對你正在使用的數據庫,先在網上尋找一些 在線資源學習一下。下面將假設你已經明白事務的基本概念。
## CodeIgniter 的事務方法
CodeIgniter 使用的事務處理方法與流行的數據庫類 ADODB 的處理方法非常相似。 我們選擇這種方式是因為它極大的簡化了事務的處理過程。大多數情況下,你只需 編寫兩行代碼就行了。
傳統的事務處理需要實現大量的工作,你必須隨時跟蹤你的查詢,并根據查詢的成功 或失敗來決定提交還是回滾。當遇到嵌套查詢時將會更加麻煩。相比之下,我們實現了 一個智能的事務系統,它將自動的為你做這些工作。(你仍然可以選擇手工管理你的 事務,但這實在是沒啥好處)
## 運行事務
要使用事務來運行你的查詢,你可以使用 $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 之間,你可以運行任意多個查詢,根據查詢執行 成功或失敗,系統將自動提交或回滾。
## 嚴格模式 (Strict Mode)
CodeIgniter 默認使用嚴格模式運行所有的事務,在嚴格模式下,如果你正在 運行多組事務,只要有一組失敗,所有組都會被回滾。如果禁用嚴格模式,那么 每一組都被視為獨立的組,這意味著其中一組失敗不會影響其他的組。
嚴格模式可以用下面的方法禁用:
~~~
$this->db->trans_strict(FALSE);
~~~
## 錯誤處理
如果你的數據庫配置文件 config/database.php 中啟用了錯誤報告(db_debug = TRUE), 當提交沒有成功時,你會看到一條標準的錯誤信息。如果沒有啟用錯誤報告, 你可以像下面這樣來管理你的錯誤:
~~~
$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
}
~~~
## 啟用事務
當執行 $this->db->trans_start() 方法時,事務將自動啟用,如果 你要禁用事務,可以使用 $this->db->trans_off() 方法來實現:
~~~
$this->db->trans_off();
$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->trans_complete();
~~~
當事務被禁用時,你的查詢會自動提交,就跟沒有使用事務一樣。
## 測試模式(Test Mode)
你可以選擇性的將你的事務系統設置為 “測試模式”,這將導致你的所有 查詢都被回滾,就算查詢成功執行也一樣。要使用 “測試模式”,你只需要 將 $this->db->trans_start() 函數的第一個參數設置為 TRUE 即可:
~~~
$this->db->trans_start(TRUE); // Query will be rolled back
$this->db->query('AN SQL QUERY...');
$this->db->trans_complete();
~~~
## 手工運行事務
如果你想手工運行事務,可以像下面這樣做:
~~~
$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();
}
~~~
注解
手動運行事務時,請務必使用 $this->db->trans_begin() 方法,?**而不是**?$this->db->trans_start() 方法。
- 歡迎使用 CodeIgniter
- 安裝說明
- 下載 CodeIgniter
- 安裝說明
- 從老版本升級
- 疑難解答
- CodeIgniter 概覽
- CodeIgniter 將從這里開始
- CodeIgniter 是什么?
- 支持特性
- 應用程序流程圖
- 模型-視圖-控制器
- 設計與架構目標
- 教程 - 內容提要
- 加載靜態內容
- 讀取新聞條目
- 創建新聞條目
- 結束語
- 常規主題
- CodeIgniter URL
- 控制器
- 保留名稱
- 視圖
- 模型
- 輔助函數
- 使用 CodeIgniter 類庫
- 創建類庫
- 使用 CodeIgniter 驅動器
- 創建驅動器
- 創建核心系統類
- 創建附屬類
- 鉤子 - 擴展框架核心
- 自動加載資源
- 公共函數
- 兼容性函數
- URI 路由
- 錯誤處理
- 網頁緩存
- 程序分析
- 以 CLI 方式運行
- 管理你的應用程序
- 處理多環境
- 在視圖文件中使用 PHP 替代語法
- 安全
- PHP 開發規范
- 類庫參考
- 基準測試類
- 緩存驅動器
- 日歷類
- 購物車類
- 配置類
- Email 類
- 加密類
- 加密類(新版)
- 文件上傳類
- 表單驗證類
- FTP 類
- 圖像處理類
- 輸入類
- Javascript 類
- 語言類
- 加載器類
- 遷移類
- 輸出類
- 分頁類
- 模板解析類
- 安全類
- Session 類
- HTML 表格類
- 引用通告類
- 排版類
- 單元測試類
- URI 類
- 用戶代理類
- XML-RPC 與 XML-RPC 服務器類
- Zip 編碼類
- 數據庫參考
- 數據庫快速入門: 示例代碼
- 數據庫配置
- 連接你的數據庫
- 查詢
- 生成查詢結果
- 查詢輔助函數
- 查詢構造器類
- 事務
- 數據庫元數據
- 自定義函數調用
- 數據庫緩存類
- 數據庫工廠類
- 數據庫工具類
- 數據庫驅動器參考
- 輔助函數參考
- 數組輔助函數
- 驗證碼輔助函數
- Cookie 輔助函數
- 日期輔助函數
- 目錄輔助函數
- 下載輔助函數
- 郵件輔助函數
- 文件輔助函數
- 表單輔助函數
- HTML 輔助函數
- 語言輔助函數
- Inflector 輔助函數
- 數字輔助函數
- 路徑輔助函數
- 安全輔助函數
- 表情輔助函數
- 字符串輔助函數
- 文本輔助函數
- 排版輔助函數
- URL 輔助函數
- XML 輔助函數
- 向 CodeIgniter 貢獻你的力量