2012-07-31 3 views
0

나는 권한이있는 사용자가 콘텐츠를 추가 할 수있는 웹 사이트를 호스팅하고 있습니다. 콘텐츠는 웹 페이지의 블록 내에 배치됩니다. 권한이 부여 된 사용자는 새 블록을 작성하고 블록을 특정 순서로 넣을 수 있습니다. 블록의 순서와 내용은 데이터베이스 내에 저장됩니다. 새로운 블록이 다음과 같은 두 가지 MySQL의 쿼리를 실행 생성MySQL : 단일 쿼리를 삽입, 업데이트 및 체크인

:

주문 번호를 데이터베이스 내의 블록은, 다음 쿼리로 업데이트됩니다

UPDATE `Block` 
SET `block_order` = `block_order` + 1 
WHERE `tab_nr` = $tab_nr 
AND `block_order` > $nr; 

새로운 블록이

INSERT INTO `Block` 
    (`id`, `tab_nr`, `block_order`, `html`, `created`) 
VALUES 
    (NULL, $tab_nr, $nr + 1, '$html', CURRENT_TIMESTAMP); 

이러한 쿼리의 문제점은 두 번째 쿼리에서 어떤 문제가 발생하더라도 첫 번째 쿼리가 실행된다는 것입니다. 두 번째 쿼리가 실패하면 (이유가 무엇이든간에) 다른 블록의 순서 번호가 첫 번째 쿼리를 실행하여 변경되었습니다. 이렇게하면 블록 주문 번호가 엉망이되었습니다.

내가 필요로하는 것은 새로운 블록을 데이터베이스에 추가하고 똑같이 번호가 매겨진 블록이있는 경우에만 다른 블록의 순서 번호를 업데이트하는 단일 쿼리입니다. 그러나 문제는 필요한 모든 것을 수행하는 쿼리를 찾을 수 없다는 것입니다. 예를 들어 "중복 키 업데이트"는 새 삽입과 충돌하는 행만 업데이트하지만 내 경우에는 다른 행도 업데이트해야합니다. 위에서 언급 한 문제를 제거하는 쿼리에 대한 제안 사항이 있습니까?

+2

*** 트랜잭션 *** 데이터베이스 쿼리 (http://dev.mysql.com/doc/refman/5.0/en/ansi-diff-transactions.html)에 대해 스스로를 교육해야합니다. – Matt

+1

MySQL의 [START TRANSACTION, COMMIT 및 ROLLBACK] (http://dev.mysql.com/doc/refman/5.5/en/commit.html) 구문을 참조하십시오. –

답변

0

Matt이 자신의 의견에서 말했듯이 트랜잭션 쿼리를 사용해야합니다. 이와 비슷한 것이 도움이 될 수 있습니다.

START TRANSACTION; 

UPDATE Block 
SET block_order = block_order + 1 
WHERE tab_nr = $tab_nr 
AND block_order > $nr; 

INSERT INTO Block 
    (id, tab_nr, block_order, html, created) 
VALUES 
    (NULL, $tab_nr, $nr + 1, '$html', CURRENT_TIMESTAMP); 

COMMIT; 

따라서 첫 번째 쿼리가 실패하더라도 전체 트랜잭션이 롤백되어 혼란을 피할 수 있습니다.

관련 문제