6

好吧,让我先解决这个问题。我的问题与此类似: Cannot rollback transaction in Zend Framework

我的表总是 innoDB,总是。我检查了有问题的表,它确实是 innoDB。到问题了。。

我有一个数据库实例,并且通过此事务运行的模型实例访问同一个数据库:

$db->beginTransaction();

try { 
  // Run an insert
  $model_record->insert(array('single_item' => 'its value'));

  // More logic, and run an update.
  $model_record->this_value = 'that';

  // Save it
  $model_record->save();

  //Commit the transaction
  $db->commit();
} catch (Exception $e) {

  // It finds the rollback, yet does nothing.
  $db->rollBack();  
}

现在,我发现这不起作用的原因是我在测试期间超出了一行的字符限制,以确保所有逻辑都正确。

它没有回滚。最重要的是,带有“single_item”的记录在数据库中。但是更新后的值不是。

我是否完全错过了一些小东西,我从来没有遇到过 MySQL 和 innoDB 的事务问题。这可能与 MySQL 相关还是 ZF 相关?任何见解都是有帮助的,谢谢。

更新:

我一直在进行更多测试,以下是一些可能有帮助的结果:

    $this->_db->beginTransaction();

    // This works
    $this->_db->insert('table_a', 
        array(
           'a_field' => 'transaction test',
        )
    );

    // This does not work, at all.  It inserts and does not rollback.  There is no commit.
    $_table_a_model->insert(
        array(
            'a_field' => 'transaction test',
        )
    );

    $this->_db->rollback();

附加更新 您需要获取模型的实例,并在其上调用事务。

$the_model = $this->_model->getAdapter();
$the_model->beginTransaction();

这没有为多个表的事务留下空间,无需为每个模型实例执行多个事务。有什么想法没有恢复到基本数据库实例?

4

2 回答 2

4

我想到了。我必须使用$db = Zend_Db_Table_Abstract::getDefaultAdapter();然后运行我的事务,以便多个模型中的所有操作在单个事务下一起工作。如果有人对此有解决办法,请随时发表评论。

于 2012-09-10T21:42:32.660 回答
1

也许您的测试用例超过最大字符数只会截断插入的数据,实际上并没有引发异常?假设如果您执行错误输入表名称之类的操作,您将得到一个异常(如果不是肯定检查 PDO::ERRMODE_EXCEPTION 是否启用)。如果你真的引发了一个异常,catch 块应该触发并回滚,如果提交是触发并且你从不调用 rollback() 听起来结果是你应该期望的。

哦,看看你的代码,假设我们应该确保 $db 在你的模型类中与那个控制器上的实例相同。看这里,看看如何在整个过程中使用相同的 $db 句柄。

编辑: @Wes 想通了。“我必须使用 $db = Zend_Db_Table_Abstract::getDefaultAdapter(); 然后运行我的事务,以便多个模型中的所有操作在一个事务下一起工作。如果有人对此有修复,请随时发表评论。”

于 2012-09-10T18:45:28.397 回答