0

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作为底层数据库

4

2 回答 2

1

SQL 有一个 for START TRANSACTIONoneCOMMIT和一个 for的语句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

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

于 2012-07-02T20:44:09.640 回答
0

这是一团糟:

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);
于 2018-12-11T20:51:22.463 回答