所以这是我的问题:
我有一个带有可选图片上传字段的文章提交表单。
当用户提交表单时 - 大致会发生这种情况:
if($this->view->form->isValid($_POST){
$db->beginTransaction();
try{
// save content of POST to Article table
if(!$this->_saveArticle($_POST)){
return;
}
// resize and save image using ID generated by previous condition
if(!$this->_saveImage($_FILES){
$db->rollback();
return;
}
// update record if image successfully generated
if(!$this->_updateArticle(){
$db->rollback();
}
$db->commit();
}
}catch (Exception $e){
$db->rollback()
}
使用映射器保存所有模型,通过检查是否存在代理键来自动执行“UPSERT”功能
public function save($Model){
if(!is_null($Model->id_article){
$Mapper->insert($Model->getFields());
return;
}
$Mapper->update($Model->getFields(),$Model->getIdentity());
}
文章表具有ID,标题和URL的复合UNIQUE索引。另外,我正在生成一个UID,它在插入之前被添加到Model的ID字段中(而不是自动递增)
当我尝试执行此操作时,它对于插入表中的第一篇文章运行正常 - 但后续调用(具有完全不同的输入)会触发DUPLICATE KEY错误。 MySQL抛出条件1(_saveArticle)中生成的ID并抱怨该密钥已经存在...
我已经抛弃了模型字段(以及条件状态 - 即插入|更新),它们按预期进行(伪):
inserting!
id = null
title = something
content = something
image = null
updating!
id = 1234123412341234
title = something
content = something else
image = 1234123412341234.jpg
此行数据不存在于数据库中。
我认为这可能是以下几点之一:
1:我正在用户登录时加载辅助数据库适配器,允许他们通过一次登录与多个站点进行交互 - 这可能会使交易混淆不清
2:这是Zend事务实现中某些描述的错误(可能由1引发)
3:我需要用INSERT替换save()... ON DUPLICATE
4:我应该重新构建提交过程,或者为不依赖于先前插入的行的UID的图像生成名称。
还在狩猎,但我想知道是否有其他人遇到过这类问题,或者是否可以指出我的解决方案
最好的SWK
答案 0 :(得分:0)
好的 - 只是为了记录,这是完全可能的。问题出在我的应用程序架构中。我在处理持久性的Mapper类中捕获异常 - 然后查询它们以返回布尔状态,从而中断进程。这反过来打破了阻止插入/更新正常工作的try / catch循环。 总结 - 是 - 您可以在单个事务中插入和更新同一行。我已经勾选了社区维基以取消代表