2011-02-18 41 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循環。 總結 - 是的 - 您可以在單個交易中插入和更新同一行。我已經勾選社區維基取消廣告

相關問題