2011-02-18 87 views
2

所以这里是我的问题:插入和更新同一个TRANSACTION中的同一行? (MySQL)

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

当用户提交表单 - 这大概会发生什么:

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() 
} 

所有型号都使用映射器,它通过检查的代理键

public function save($Model){ 
    if(!is_null($Model->id_article){ 
     $Mapper->insert($Model->getFields()); 
     return; 
    } 
    $Mapper->update($Model->getFields(),$Model->getIdentity()); 
} 
存在自动“UPSERT”功能保存

文章表具有ID,标题和URL的组合UNIQUE索引。此外,我生成一个UID,它在插入之前被添加到模型的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:我加载在用户登录时的二次DB适配器,使他们从一个登录几个网站的接口 - 这可能是令人困惑交易莫名其妙

2:这是在Zend的事务实现一些描述(可能由1触发)错误

3:我需要更换保存()与INSERT ... ON DUPLICATE

4:我应该重组提交过程,或生成用于不依赖于先前插入的行的UID的图像的名称。

仍在追捕,但我想知道是否有人遇到这样的问题,或者可以点我在一个解决方案

最好SWK

+0

+1,wtf是upsert ??? – ajreal 2011-02-18 21:14:20

+2

@ajreal:upsert = if exists then update else insert – 2011-02-18 21:17:55

回答

0

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

相关问题