mysql에서 SET autocommit = 1과 START TRANSACTION의 차이점 (내가 놓친 것이 있습니까?)


80

나는 MySQL의 트랜잭션을 읽고 있는데 내가 특정 사항을 올바르게 파악했는지 확실하지 않으며 올바르게 이해했는지 확인하고 싶습니다. 트랜잭션이 무엇을해야하는지 알고 있습니다. 문장 의미론을 이해했는지 여부는 확실하지 않습니다.

따라서 내 질문은 다음과 같이 잘못된 것입니다 (그렇다면 잘못된 것입니다).

기본적으로 자동 커밋 모드는 MySQL에서 활성화됩니다.

이제 SET autocommit=0;트랜잭션을 시작하고 SET autocommit=1;암시 적으로 커밋합니다. 그것은 할 수 COMMIT;뿐만 아니라로 ROLLBACK;모두 여전히 그 후 0으로 설정 (새로운 트랜잭션이 암시 적으로 시작) 자동 커밋하는 경우에.

START TRANSACTION;기본적 것이다 SET autocommit=0;때까지 COMMIT;또는이 ROLLBACK;일어난다.

즉, 는 암시 적으로 after 또는 추가를 추가하는 것과 동일 하다는 사실을 제외 START TRANSACTION;하고 SET autocommit=0;는 동등합니다.START TRANSACTION;SET autocommit=0;COMMIT;ROLLBACK;

이 경우 http://dev.mysql.com/doc/refman/5.5/en/set-transaction.html#isolevel_serializable을 이해하지 못합니다 . 격리 수준이 있다는 것은 트랜잭션이 있음을 의미합니다. 어쨌든 자동 커밋을 꺼야한다는 뜻입니까?

트랜잭션 시작과 자동 커밋 설정 사이에 다른 차이점 (위에서 설명한 것 제외)이 있다면 무엇입니까?

답변:


81

데이터베이스에 대한 트랜잭션 (자동 커밋, 명시 적 및 암시 적) 처리를 인식하면 백업에서 데이터를 복원하지 않아도됩니다.

트랜잭션은 데이터 조작 문을 제어하여 원 자성을 보장합니다. "원자 적"이라는 것은 트랜잭션이 발생하거나 발생하지 않음을 의미합니다. 트랜잭션 완료를 데이터베이스에 알리는 유일한 방법은 COMMIT또는 ROLLBACK문 을 사용하는 것입니다 (ANSI-92에 따라 슬프게도 트랜잭션을 생성 / 시작하는 구문을 포함하지 않았으므로 공급 업체에 따라 다름). COMMIT트랜잭션 내에서 변경된 사항 (있는 경우)을 적용합니다. ROLLBACK트랜잭션 내에서 발생한 모든 작업을 무시합니다. UPDATE / DELETE 문이 의도하지 않은 작업을 수행 할 때 매우 바람직 합니다.

일반적으로 개별 DML (Insert, Update, Delete) 문은 자동 커밋 트랜잭션에서 수행되며 문이 성공적으로 완료되는 즉시 커밋됩니다. 즉, 귀하와 같은 경우에 문이 실행되기 전의 상태로 데이터베이스를 롤백 할 기회가 없습니다. 문제가 발생한 경우 사용 가능한 유일한 복원 옵션은 백업에서 데이터를 재구성하는 것입니다 (존재하는 경우). MySQL에서 자동 커밋은 InnoDB에 대해 기본적으로 켜져 있습니다. MyISAM은 트랜잭션을 지원하지 않습니다. 다음을 사용하여 비활성화 할 수 있습니다.

SET autocommit = 0

명시 적 트랜잭션은 문이 명시 적으로 정의 된 트랜잭션 코드 블록 내에서 래핑되는 경우 입니다. 즉, MySQL의 경우START TRANSACTION . 또한 트랜잭션이 끝날 때 명시 적으로 작성된 COMMIT또는 ROLLBACK진술이 필요 합니다. 중첩 된 트랜잭션은이 항목의 범위를 벗어납니다.

암시 적 트랜잭션은 명시 적 트랜잭션과 약간 다릅니다. 암시 적 트랜잭션은 트랜잭션을 명시 적으로 정의 할 필요가 없습니다. 그러나 명시 적 트랜잭션과 마찬가지로 COMMIT또는 ROLLBACK문을 제공해야합니다.

결론

명시 적 트랜잭션은 가장 이상적인 솔루션입니다 - 그들은 문을 필요로 COMMIT하거나 ROLLBACK, 트랜잭션을 완료하고, 어떤 일이 일어나고 것은 분명히 필요가 있어야 읽을 다른 사람을 위해 적혀있다. 데이터베이스와 대화식으로 작업하는 경우 암시 적 트랜잭션은 괜찮지 COMMIT만 결과가 테스트되고 유효성이 철저하게 확인 된 후에 만 ​​명령문을 지정해야합니다.

즉, 다음을 사용해야합니다.

SET autocommit = 0;

START TRANSACTION;
  UPDATE ...;

... COMMIT;결과가 정확할 때만 사용 합니다.

즉, UPDATE 및 DELETE 문은 일반적으로 특정 세부 정보가 아닌 영향을받는 행 수만 반환합니다. 이러한 문을 SELECT 문으로 변환하고 결과를 검토 하여 UPDATE / DELETE 문을 시도 하기 전에 정확성을 확인 하십시오.

추가

DDL (Data Definition Language) 문은 자동으로 커밋되며 COMMIT 문이 필요하지 않습니다. IE : 테이블, 인덱스, 저장 프로 시저, 데이터베이스 및 뷰 생성 또는 변경 문.


9
와우, 빠르 네요 :-) 고마워요! 내가 잘 이해하지 못하는 것은 내가 SET autocommit = 0이 필요한 이유입니다. 위의 예에서; 거래를 시작하는 것이 그것을 의미하지 않습니까? 그렇지 않은 경우 차이점은 무엇입니까?
ralokt

1
@tkolar : 자동 커밋을 비활성화하면 모든 사람이 START TRANSACTION을 사용해야합니다. 모든 사람이 그것을 사용해야한다는 것을 알고있는 것은 아닙니다. '과정, 다른 DBA도 다시 켤 수 있습니다 ...
OMG Ponies

3
내가 가진 추측 SET autocommit = 0;사용 trasactions에 잊지하는 것만 선호가
티모 Huovinen

따라서 명시 적으로 트랜잭션을 시작할 때 자동 커밋이 ON 인 경우 START TRANSACTION에도 명시 적으로 지정해야합니다 COMMIT. 맞나요?
tomwang1013

중첩 된 저장 프로 시저에서 Call. 내가 @OMGPonies 사용해야 무엇
selvakumar

20

이노 , 당신은 START TRANSACTION;대신에,이 엔진에서 거래를 할 수있는 공식적으로 권장되는 방법이다, SET AUTOCOMMIT = 0;(사용하지 않는 SET AUTOCOMMIT = 0;에서 거래 이노 가 최적화하기위한 경우를 제외하고 읽기 전용 트랜잭션). 함께 커밋 COMMIT;.

당신은 사용 할 수 있습니다 SET AUTOCOMMIT = 0;InnoDB의 테스트 목적으로, 그리고 정확하게 거래를위한.

에서 의 MyISAM , 당신은하지 않습니다 START TRANSACTION;. 이 엔진에서는 SET AUTOCOMMIT = 0;트랜잭션에 사용 합니다. 확약 COMMIT;또는 SET AUTOCOMMIT = 1;(차이는 아래의 MyISAM 예 해설에서 설명). InnoDB에서도 이런 방식으로 트랜잭션을 수행 할 수 있습니다.

출처 : http://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_autocommit

일반적인 사용 거래의 예 :

/* InnoDB */
START TRANSACTION;

INSERT INTO table_name (table_field) VALUES ('foo');
INSERT INTO table_name (table_field) VALUES ('bar');

COMMIT; /* SET AUTOCOMMIT = 1 might not set AUTOCOMMIT to its previous state */

/* MyISAM */
SET AUTOCOMMIT = 0;

INSERT INTO table_name (table_field) VALUES ('foo');
INSERT INTO table_name (table_field) VALUES ('bar');

SET AUTOCOMMIT = 1; /* COMMIT statement instead would not restore AUTOCOMMIT to 1 */

1

https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html

InnoDB 테이블과 같은 트랜잭션 테이블에서 LOCK TABLES 및 UNLOCK TABLES를 사용하는 올바른 방법은 SET autocommit = 0 (START TRANSACTION 아님) 다음에 LOCK TABLES를 사용하여 트랜잭션을 시작하고 트랜잭션을 커밋 할 때까지 UNLOCK TABLES를 호출하지 않는 것입니다. 명시 적으로. 예를 들어, 테이블 t1에 쓰고 테이블 t2에서 읽어야하는 경우 다음을 수행 할 수 있습니다.

SET autocommit=0;
LOCK TABLES t1 WRITE, t2 READ, ...;... do something with tables t1 and t2 here ...
COMMIT;
UNLOCK TABLES;

누군가 정확히 테이블 잠금이 함께 작동 autocommit=0하지만 작동 하지 않는 이유를 알고 START TRANSACTION있습니까? 그것은 나에게 완전히 임의적 인 것 같습니다. 기술적 이유가 있습니까?
jlh

1

롤백을 사용하려면 시작 트랜잭션 을 사용 하고 그렇지 않으면 모든 것을 잊어 버리십시오.

기본적으로 MySQL은 데이터베이스에 대한 변경 사항을 자동으로 커밋합니다.

MySQL이 이러한 변경 사항을 자동으로 커밋하지 않도록하려면 다음을 실행하십시오.

SET autocommit = 0;
//OR    
SET autocommit = OFF

자동 커밋 모드를 명시 적으로 활성화하려면 :

SET autocommit = 1;
//OR    
SET autocommit = ON;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.