Php Zend Framework数据库事务-Can';t回滚

Php Zend Framework数据库事务-Can';t回滚,php,mysql,zend-framework,transactions,Php,Mysql,Zend Framework,Transactions,好吧,让我先把这件事弄清楚。我的问题与此类似: 我的桌子总是innoDB,总是。我已经检查了有问题的表,它确实是innoDB。关于这个问题 我有一个数据库实例,在该事务中运行的模型实例与相同的数据库: $db->beginTransaction(); try { // Run an insert $model_record->insert(array('single_item' => 'its value')); // More logic, and run

好吧,让我先把这件事弄清楚。我的问题与此类似:

我的桌子总是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();

这样,如果不对每个模型实例执行多个事务,就不会为多个表留下任何事务空间。如果不恢复到基本数据库实例,有什么想法吗?

可能您的测试用例超过了最大字符数,只会截断插入的数据,实际上不会引发异常?假设如果您执行类似于错误键入表名的操作,您将得到一个异常(如果不确定,请选中启用PDO::ERRMODE_异常)。如果您确实引发了一个catch块应该触发并回滚的异常,那么如果相反地触发了commit,而您从未调用rollback(),那么听起来结果就是您应该期望的结果

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

编辑:
@韦斯弄明白了。“我必须使用$db=Zend_db_Table_Abstract::getDefaultAdapter();然后运行我的事务,这样多个模型中的所有操作都可以在一个事务下协同工作。如果有人对此有解决方案,请随意评论。”

我找到了答案。我必须使用
$db=Zend_db_Table_Abstract::getDefaultAdapter()
然后运行my transactions,这样多个模型中的所有操作都可以在单个事务下协同工作。如果有人对此有解决办法,请随时发表评论

$model\u record->foo()方法中是否有任何方法实际导致引发异常?它们没有。如果没有例外,一切正常。我得到的异常是一个直接来自MySQL的异常。我刚刚使用正确的数据进行了测试,在commit()之前抛出了一个异常;没有回滚。我向您保证,它通过mysql抛出一个异常,事实上它被捕获了。似乎没有什么不同。如果所有事务项都消失了,则功能相同。使用其他结果更新了问题。在我看来,如果您是从单例模式获取适配器,则应该能够避免此问题。ZF中我的“模型”通常使用我的基本映射器类上的受保护方法从注册表中提取适配器
$db=Zend_Registry::get($this->getAdapterName())我正在做完全相同的事情,没有骰子。我的模型都是从Zend_Db_Table_AbstractCool扩展而来的!非常感谢你!但是为什么会这样?有什么解释吗?在我的Bootstrap.php中,我创建了$db并将其保存到Zend_注册表中,并将其设置为Zend_db_Table_Abstract::setDefaultAdapter($db)。那么,为什么在我从注册表中取出这个对象并使用它之后它就不工作了呢?您的解决方案工作完美!