我在trans_start()和trans_complete()之间运行了3个插入查询。它们运行得非常好......唯一的问题是,当我在完成之前运行回滚它只回滚插入查询1和3.这些是回滚的唯一查询,即使我试图改变它的位置而没有成功。请让我知道我做错了什么?我尝试通过$ this-> db-> query(...)编写查询,而不是使用活动记录,但它给出相同的结果......
我有以下代码。
$this->db->trans_start();
//insert transaction
$i_data = array(
'user_id' => $app['opp_id']
, 'amount' => $app['total']
, 'type' => 1
, 'feb_bal' => 1
, 'note' => 'Earnings'
);
$this->db->insert('transaction', $i_data);
$tran_id = $this->db->insert_id();
//insert 2
$c_data = array(
'oppt_opp_id' => $app['id']
, 'status' => 0 //closed
);
$this->db->insert('progress', $c_data);
//insert 3
$e_data = array(
'tran_id' => $tran_id
, 'app_id' => $app['id']
, 'type' => 1
, 'status' => 2
);
$this->db->insert('earn_spend', $e_data);
$this->db->trans_rollback();
$this->db->trans_complete();
答案 0 :(得分:4)
CodeIgniter的数据库抽象允许您使用事务 支持事务安全表类型的数据库。在MySQL中,你是 需要运行InnoDB或BDB表类型而不是更多 常见的MyISAM。
文档: http://ellislab.com/codeigniter/user-guide/database/transactions.html
您可以尝试使用以下代码吗?我根据CI文件准备了代码
<?php
$this->db->trans_begin();
//insert transaction
$i_data = array(
'user_id' => $app['opp_id']
, 'amount' => $app['total']
, 'type' => 1
, 'feb_bal' => 1
, 'note' => 'Earnings'
);
$this->db->insert('transaction', $i_data);
$tran_id = $this->db->insert_id();
//insert 2
$c_data = array(
'oppt_opp_id' => $app['id']
, 'status' => 0 //closed
);
$this->db->insert('progress', $c_data);
//insert 3
$e_data = array(
'tran_id' => $tran_id
, 'app_id' => $app['id']
, 'type' => 1
, 'status' => 2
);
$this->db->insert('earn_spend', $e_data);
if ($this->db->trans_status() === FALSE)
{
$this->db->trans_rollback();
}
else
{
$this->db->trans_commit();
}
?>