링크 테이블을 통해 '위치'가있는 엔티티 '프로그램'이있는 시스템을 개발 중입니다. 젠드 프레임 워크를 Zend_Db_Table과 함께 사용하고 있습니다.Zend_Db_Table - 트랜잭션 중복 엔트리 오류에서 삭제 후 삽입
위치 1 ----- * programlocation * ------ (1 개) 프로그램 내 매퍼에서
을 내가 저장하는 기능을 가지고() 프로그램 저장해야하는 :
public function save(Application_Model_Program $program)
{
try
{
//start transaction
$this->_getDbTable()->getAdapter()->beginTransaction();
//make sure category is saved (has an id)
$categoryMapper = new Application_Model_Mapper_ProgramCategory();
$categoryMapper->save($program->getCategory());
$programData = array(
'title'=>$program->getTitle(),
'slug'=>$program->getSlug(),
'description'=>$program->getDescription(),
'dateFrom'=>$program->getDateFrom()->toString(self::DB_DATE_FORMAT),
'dateTo'=>$program->getDateTo()->toString(self::DB_DATE_FORMAT),
'category'=>$program->getCategory()->getId()
);
if($program->getId() === null)
{
$newId = $this->_getDbTable()->insert($programData);
$program->setId($newId);
}
else
{
$where = $this->_getDbTable()->getAdapter()->quoteInto("id = ?", $program->getId());
$this->_getDbTable()->update($programData, $where);
}
//save locations to program
$programProgramLocationMapper = new Application_Model_Mapper_Link_ProgramProgramLocation();
$programProgramLocationMapper->saveLocationsToProgram($program->getLocations(), $program);
//commit
$this->_getDbTable()->getAdapter()->commit();
}
catch(Exception $e)
{
//rollback transaction
$this->_getDbTable()->getAdapter()->rollBack();
throw $e;
}
}
을 Application_Model_Mapper_Link_ProgramProgramLocation :: saveLocationsToProgram 방법은 다음과 같습니다
public function saveLocationsToProgram(
array $locations,
Application_Model_Program $program)
{
$deleteWhere = $this->_getDbTable()->getAdapter()->quoteInto("program = ?", $program->getId());
$this->_getDbTable()->delete($deleteWhere);
foreach($locations as $location)
{
$data = array('program'=>$program->getId(), 'location'=>$location->getId());
$this->_getDbTable()->insert($data);
}
}
내 문제는 예외가 지난 표시 삽입 문에 제기된다 "Mysqli 문 EXE 귀여운 오류 : 'PRIMARY'키에 대해 '1-1'항목이 중복되었습니다. 삽입이 올바르게 실행되지 않기 때문에 delete 문처럼 보입니다. 그러나 delete 문은 삭제 된 항목의 양을 올바르게 반환합니다. 삭제 후에 select를 수행하면 항목이 올바르게 삭제 된 것 같습니다.
동일한 문제가 파일에 태그가있는 유사한 구조에서 발생합니다.
이 문제의 원인과 해결 방법에 대해 알지 못합니다. 시스템의 기능을 방해하는 경우 문제가 될 수 있습니다.