【问题标题】:How does $this->db->trans_status() work in codeigniter transactions?$this->db->trans_status() 如何在 codeigniter 事务中工作?
【发布时间】:2012-07-02 20:36:07
【问题描述】:

CodeIgniter 中的$this->db->trans_status() 究竟是如何理解事务中的查询是否成功的?

来源:http://codeigniter.com/user_guide/database/transactions.html

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

我使用 MySQL 作为底层数据库

【问题讨论】:

标签: mysql codeigniter transactions


【解决方案1】:

SQL 有一个START TRANSACTION 的语句,一个COMMIT 和一个ROLLBACK 的语句。

您的数据库驱动程序和/或抽象层没有一次性发送整个列表:

$query_string = '
    START TRANSACTION;
        SELECT something FROM somewhere;
        UPDATE something SET something.we_have = something.else;
    COMMIT;';
$dba->execute($query_string);

它们可以单独发送,驱动程序和/或抽象层可以等待查询执行并返回 SQL STATUS。

$query_string = 'START TRANSACTION;';
$dba->execute($query_string);

$query_string = 'SELECT something FROM somewhere;';
$dba->execute($query_string);

$query_string = 'UPDATE something SET something.we_have = something.else;';
$dba->execute($query_string);
$status = $dba->get_status();

if($status)
    $query_string = 'COMMIT;';
else // darn our update must have failed
    $dba->execute($query_string);

根据该状态,您可以将天气决定为COMMITROLLBACK

当然,这意味着您的脚本连接数据库所花费的总时间比它在一个连接中将整个字符串推到管道中的时间要长。

【讨论】:

  • 感谢@Mihai。我很想知道 dba->get_status() 如何理解它实际上正在返回 SQL 的正确状态?它是基于 SQL 死锁问题吗?它是基于格式错误的 SQL 字符串吗?它是基于超时问题吗?我实际上在 trans_start 和 trans_complete 之间有大约 10 到 15 个 SQL。
  • 要么您只遇到过由 DB 引擎附加明确消息的 SQL 状态,要么 DBA 像 SHOW INNODB STATUS 那样严格检查以查找状态信息。
  • 我检查了 CI_DB_Driver 的 the code,它只是检查上一个查询中是否有任何错误。它不会在 MySQL 的具体驱动程序类中实现较低。
【解决方案2】:

这是一团糟:

if($status)
    $query_string = 'COMMIT;';
else // darn our update must have failed
    $dba->execute($query_string);

也许你想要:

if($status)
    $query_string = 'COMMIT';
else // darn our update must have failed
    $query_string = 'ROLLBACK';

$dba->execute($query_string);

【讨论】:

    猜你喜欢
    • 2013-01-19
    • 1970-01-01
    • 2019-05-03
    • 2011-10-20
    • 1970-01-01
    • 2016-07-14
    • 2023-03-27
    • 2013-05-31
    • 1970-01-01
    相关资源
    最近更新 更多