Php Zend Framework数据库事务-Can';t回滚
好吧,让我先把这件事弄清楚。我的问题与此类似: 我的桌子总是innoDB,总是。我已经检查了有问题的表,它确实是innoDB。关于这个问题 我有一个数据库实例,在该事务中运行的模型实例与相同的数据库: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
$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)。那么,为什么在我从注册表中取出这个对象并使用它之后它就不工作了呢?您的解决方案工作完美!