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로 설정 모든 것을 잊어 버립니다 .
'ProgramingTip' 카테고리의 다른 글
Parcelable의 하위 클래스를 다른 Parcel에 작성 (0) | 2020.11.16 |
---|---|
도구를 투명하게 만드는 방법은 무엇입니까? (0) | 2020.11.16 |
모바일 장치의 Twitter 부트 신뢰할 수있는 모달 (0) | 2020.11.15 |
Swagger API 선언에서 JSON-Schema를 생성하는 방법 (0) | 2020.11.15 |
Pandas로 가변 수의 열 처리 -Python (0) | 2020.11.15 |