所以这里是我的问题:插入和更新同一个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
+1,wtf是upsert ??? – ajreal 2011-02-18 21:14:20
@ajreal:upsert = if exists then update else insert – 2011-02-18 21:17:55