所以這裏是我的問題:插入和更新同一個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