directory search
Array Array Helper Benchmarking Benchmarking Class Caching Caching Driver Calendaring Calendaring Class CAPTCHA CAPTCHA Helper Config Config Class Cookie Cookie Helper Database Connecting to your Database Custom Function Calls Database Caching Class Database Configuration Database Forge Class Database Metadata Database Quick Start: Example Code Database Reference Database Utility Class DB Driver Reference Generating Query Results Queries Query Builder Class Query Helper Methods Transactions Date Date Helper Directory Directory Helper Download Download Helper Email Email Class Email Helper Encrypt Encrypt Class Encryption Encryption Library File File Helper File Uploading File Uploading Class Form Form Helper Form Validation Form Validation FTP FTP Class Functions compatibility_functions common_functions HTML HTML Helper HTML Table HTML Table Class Image Manipulation Image Manipulation Class Inflector Inflector Helper Input Input Class Javascript Javascript Class Language Language Class Language Helper Loader Loader Class Migrations Migrations Class Number Number Helper Output Output Class Pagination Pagination Class Path Path Helper Security Security Class Security Helper Session Session Library Shopping Cart Shopping Cart Class Smiley Smiley Helper String String Helper Template Parser Template Parser Class Text Text Helper Trackback Trackback Class Typography Typography Class Typography Helper Unit Testing Unit Testing Class URI URL User Agent XML XML-RPC and XML-RPC Server Zip Encoding Zip Encoding Class XML-RPC and XML-RPC Server Classes XML Helper User Agent Class URL Helper URI Class
characters

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

您可以在开始函数/完成函数之间运行任意数量的查询,这些查询都将根据任何给定查询的成功或失败被提交或回滚。

严格模式

默认情况下,CodeIgniter以严格模式运行所有事务。启用严格模式时,如果您正在运行多组事务,如果一个组失败,所有组都将回滚。如果禁用严格模式,则每个组将被独立处理,这意味着一个组的失败不会影响其他组。

严格模式可以禁用如下:

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

管理错误

如果在config/database.php文件中启用了错误报告,如果提交失败,您将看到一个标准错误消息。如果关闭调试,您可以管理自己的错误,如下所示:

$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_off()*

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

当事务被禁用时,您的查询将自动提交,就像在没有事务的情况下运行查询时一样,实际上忽略了对trans_start(),,,trans_complete()

测试模式

您可以选择将交易系统置于“测试模式”,这将导致您的查询被回滚 - 即使查询产生了有效的结果。要使用测试模式,只需将$ 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()。

Previous article: Next article: