2012-03-30 3 views
3

조인이있는 sql 쿼리 중에 트랜잭션을 사용해야합니까?가입 쿼리에 트랜잭션이 필요합니까?

내가 좋아하는 뭔가에 대해 생각했다 :

Delete table1, table2, table3 
FROM table1 INNER JOIN table2 ON(...) 
LEFT JOIN table3 ON (...) 
WHERE table1.column = something... 

이 (내가 구문이 100 % 정확한지 잘 모릅니다,하지만 난 당신이 어쨌든 그것을 이해 추측)

위험이 그 모든 있습니까 삭제해야 할 행이 삭제되지 않습니까?

감사합니다.

답변

4

을 확인 실행 될 수 있도록 단일 트랜잭션을 포장해야합니다. SQL 명령은 정의에 의해 원자 적입니다. 즉, 조건과 일치하는 모든 행을 삭제하거나 오류가 전혀 발생하지 않습니다.

EDIT :이 대답은 이론적으로 정확하며 ACID를 지원하는 데이터베이스에 적합합니다. 데이터베이스가 원 자성을 지원하지 않거나 데이터베이스 엔진 부분에서 잘못된 동작을 유발하는 버그가있는 경우 모든 베팅이 해제됩니다. 그러나 트랜잭션을 사용하면 이러한 시나리오에서 마술처럼 효과적 일 수는 없습니다.

+2

이것은 InnoDB 테이블에 영향을주는 문장에만 해당된다. 예 : MyISAM 테이블은 ** atomic이 아니며 테이블의 절반 만 삭제할 수 있습니다. –

+0

@a_horse_with_no_name - 동의합니다. 이는 ACID 테이블에만 맞습니다. 그러나 MyISAM 테이블에 대한 경험이 없으므로 트랜잭션이 해당 시나리오에서 도움이되는지 확신 할 수 없습니다. – SWeko

+0

@SWeko 경우에 따라 롤백되지 않습니다. 어쨌든 MySQL v5.1 (http://bugs.mysql.com/bug.php?id=45309 참조) – mattytommo

5

트랜잭션을 사용하면 아무 것도 할 수 없다고 생각합니다. 대부분의 경우 단일 쿼리는 원자 적이며 단일 트랜잭션으로 실행됩니다. 로그가없는 대량 삽입과 자르기와 같은 MS-SQL 서버 쿼리와 관련하여 트랜잭션이 필요할 수 있습니다. 귀하의 경우에는 귀하의 삭제 진술 주위에 사본이 필요하지 않습니다. 여러 개의 문이 다음이 있다면 당신은이 하나의 명령 (DELETE) 트랜잭션을 명시 적으로 사용할 필요가 없습니다이기 때문에 전부 또는 없음이 question

4

아니요, 거래가 필요하지 않습니다. 트랜잭션은 여러 명령문을 하나의 단위로 실행합니다. 트랜잭션 내에서 또는 트랜잭션 외부에서 단일 명령문을 실행하면 항상 동일한 결과가 산출됩니다.

그리고 마지막 질문에 대답하기 위해 성명서는 전부 또는 일부입니다. 성명서 중간에 정전이 있었다면 그럴 수 있다고 생각할 수있는 유일한 예외는 ... 거래가 도움이되지 않을 것입니다. INSERTUPDATESELECT, DELETE 문, 더 명시 적 트랜잭션이없는 어떤 들어

1

명령 및 오류가 발생하는 경우 데이터베이스 엔진은 전체 문을 롤백합니다.

관련 문제