2011-02-18 2 views
2

그래서 내 문제는 :동일한 TRANSACTION에서 동일한 행을 INSERT하고 UPDATE 하시겠습니까? (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"기능을 자동화 매퍼를 사용하여 저장됩니다

article 테이블에는 ID, 제목 및 URL의 고유 UNIQUE 인덱스가 있습니다. 또한, 삽입하기 전에 모델의 ID 필드에 추가되는 UID를 생성합니다 (자동 증가 대신).

실행하려고하면 첫 번째 기사가 table - 그러나 후속 호출 (근본적으로 다른 입력 사용)은 DUPLICATE KEY 오류를 트리거합니다. MySQL은 조건 1 (_saveArticle)에서 생성 된 ID를 반환하고 키가 이미 존재한다고 불평합니다 ...

Model 필드 (및 조건 상태 - 삽입 | 업데이트)를 버리고 예상대로 진행됩니다 (의사) :

inserting! 
id = null 
title = something 
content = something 
image = null 

updating! 
id = 1234123412341234 
title = something 
content = something else 
image = 1234123412341234.jpg 

이 행 데이터는 데이터베이스에 없습니다.

1 :

나는이 몇 가지 중 하나가 될 수있는 그림 나는 하나의 로그인에서 여러 사이트와 인터페이스하도록 허용 사용자 로그인에 보조 DB 어댑터를로드하고 있습니다 -이 혼동 될 수 있습니다 트랜잭션 어떻게 든

2 : 그것은 (아마도 1에 의해 트리거) 젠드 트랜잭션 구현에 약간의 설명 버그

3의 : 내가를 교체해야 INSERT ...를 사용하여 save()를 호출하십시오. 중복 ON

4 :: 제출 프로세스를 재구성하거나 이전에 삽입 한 행의 UID에 종속되지 않는 이미지의 이름을 생성해야합니다.

아직도 사냥,하지만 난 다른 사람이 문제의이 종류가 발생했습니다 또는 솔루션

최고의 SWK

+0

+1, wtf는 upsert ??? – ajreal

+2

@ajreal : upsert = if exists then update else –

답변

0

OK 방향으로 날 지점 수 있는지 궁금 해서요 - 단지 기록을 위해,이 전적으로 가능한. 응용 프로그램 아키텍처에 문제가있었습니다. 지속성을 처리하는 Mapper 클래스에서 Exceptions를 잡아 내고 부울 상태를 반환하도록 쿼리하여 프로세스를 중단합니다. 이것은 차례로 삽입/업데이트가 올바르게 작동하지 못하게하는 try/catch 루프를 깨뜨린 것입니다. 요약하면 - 예 - 단일 트랜잭션에서 동일한 행을 삽입하고 업데이트 할 수 있습니다. 나는 커뮤니티 위키에 repown을 취소 할 것을 각인시켰다

+0

모델에서 지속성을 어떻게 처리 했습니까? –

+0

@b_dubb 그것은 PDT에 위임 한 Zend_Table에 위임합니다 – sunwukung

+0

최근에 와일드 카드 mysql 검색으로 지속성 문제가 발생했으며 zend 캐시를 사용하여 페이지가 매겨진 결과가있는 여러 페이지로드를 지속해야했습니다. uri를 통해 캐시 된 데이터의 id를 전달했습니다. 그것이 페이지로드를 통해 데이터를 유지하기 위해 다른 솔루션을 사용하여 나타납니다 때문에이 게시물에 관심이 있었어 –