交易 | Transactions
交易
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()。