INSERT和UPDATE在同一个TRANSACTION中的同一行? (MySQL的)

时间:2011-02-18 21:12:26

标签: mysql zend-framework transactions zend-db

所以这是我的问题:

我有一个带有可选图片上传字段的文章提交表单。

当用户提交表单时 - 大致会发生这种情况:

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

1 个答案:

答案 0 :(得分:0)

好的 - 只是为了记录,这是完全可能的。问题出在我的应用程序架构中。我在处理持久性的Mapper类中捕获异常 - 然后查询它们以返回布尔状态,从而中断进程。这反过来打破了阻止插入/更新正常工作的try / catch循环。 总结 - 是 - 您可以在单个事务中插入和更新同一行。我已经勾选了社区维基以取消代表