ProgramingTip

mysql에서 SET autocommit = 1과 START TRANSACTION의 차이점 (내가 놓친 위치?)

bestdevel 2020. 11. 15. 11:36
반응형

mysql에서 SET autocommit = 1과 START TRANSACTION의 차이점 (내가 놓친 위치?)


나는 MySQL의 트랜잭션을 이해하고 있습니다. 트랜잭션이 무엇을 해야하는지 알고 있습니다. 문장 의미론을 이해했는지 여부는 확실하지 않습니다.

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

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

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

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

즉, 는 암시 적으로 또는 추가를 추가하는 것과 동일 하다는 사실을 제외 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을 이해하지 못합니다 . 격리 수준이 것은 트랜잭션이 있음을 의미합니다. 어쨌든 자동 커밋을 꺼야한다는 뜻입니까?

트랜잭션을 시작하는 것과 자동 커밋을 설정하는 사이에 다른 차이점 (위에서 중복 것 제외)이있는 것입니까?


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

트랜잭션은 데이터 조작 문을 제어하여 원 자성을 보장합니다. "원자 적"이라는 트랜잭션이 발생하거나 발생하지 않음을 의미합니다. 트랜잭션 완료를 데이터베이스에 알리는 유일한 방법은 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 : 테이블, 고급, 저장 프로 시저, 데이터베이스 및 뷰 생성 또는 변경 문.


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

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

에서 의 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 */

롤백을 사용하려는 시작 트랜잭션 을 사용 하고 있습니다 MySQL autocommit이 기본적으로 1로 설정 모든 것을 잊어 버립니다 .

참고 URL : https://stackoverflow.com/questions/2950676/difference-between-set-autocommit-1-and-start-transaction-in-mysql-have-i-misse

반응형