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 作为基础数据库
答案 0 :(得分: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状态。
$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);
根据该状态,您可以将天气定为COMMIT
或ROLLBACK
。
当然,这意味着脚本连接到数据库所花费的总时间比在一个连接中将整个字符串推入管道时要大。
答案 1 :(得分: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);