INSERT는 자동 커밋됩니까?


13

우리의 응용 프로그램은 레코드를 추가하기 위해 INSERT 쿼리를 MySQL 데이터베이스에 시작합니다. 레코드가 자동 커밋되는지 여부를 알고 싶습니다. ROLLBACK 명령을 실행하면 데이터베이스는 언제 롤백을 수행합니까? COMMIT 후에 롤백이 가능합니까?


InnoDB는 COMMIT / ROLLBACK을 사용하기 때문에 19 시간 전에 태그를 'innodb'로 표시했습니다.
RolandoMySQLDBA

이는 개발자와 DBA에게 트랜잭션 동작, 트랜잭션을 지원하는 해당 응용 프로그램 패러다임 및 그 결과 (좋거나 나쁨)에주의를 기울 이도록 +1합니다.
RolandoMySQLDBA

내 답변 아래에 의견으로 귀하의 질문에 답변했습니다.
RolandoMySQLDBA

답변:


10

귀하의 질문에 대한 답변은 귀하가 둘 이상의 거래 내역에 해당하는 거래에 있는지 여부에 따라 다릅니다. (InnoDB로 질문에 태그를 달았습니다. 답변은 MyISAM과 다릅니다.)

참조 매뉴얼에서 : http://dev.mysql.com/doc/refman/5.1/en/commit.html

기본적으로 MySQL은 자동 커밋 모드가 활성화 된 상태로 실행됩니다. 이것은 테이블을 업데이트 (수정)하는 명령문을 실행하자마자 MySQL이 업데이트를 디스크에 저장하여 영구적으로 만듭니다.

예, 기본적으로을 사용하는 경우 INSERT삽입 한 레코드가 커밋되고 롤백을 시도 할 필요가 없습니다. ( BEGIN과 사이에 각 문장을 감싸는 것과 사실상 동일 COMMIT합니다.)

그러나 트랜잭션을 명시 적으로 처리하는 COMMIT경우 레코드를 커밋하는 데 사용해야 하지만을 (를) 사용할 수도 있습니다 ROLLBACK.

START TRANSACTION(또는 BEGIN) 를 사용하여 명시 적으로 트랜잭션을 시작할 수 있습니다 . 이것은 autocommit설정과 무관 합니다 (기본적으로 켜져 있음).

START TRANSACTION을 사용하면 COMMIT 또는 ROLLBACK으로 트랜잭션을 종료 할 때까지 자동 커밋이 비활성화 된 상태로 유지됩니다. 그런 다음 자동 커밋 모드는 이전 상태로 돌아갑니다.

또는, autocommit=0다른 거래 종료 후의 진술이 거래를 시작한다고 생각합니다 (그러나 여전히 START TRANSACTION명시 적으로 사용할 수는 있습니다 ). 그것은 적어도 내가 이것을 해석 하는 방식입니다 .

자동 커밋 모드 1로 설정하면 테이블에 대한 모든 변경 사항이 즉시 적용됩니다. 0으로 설정되면 COMMIT를 사용하여 트랜잭션을 승인하거나 ROLLBACK을 사용하여 취소해야합니다. 자동 커밋이 0이고 1로 변경하면 MySQL은 열려있는 트랜잭션에 대해 자동 COMMIT를 수행합니다. 트랜잭션을 시작하는 또 다른 방법은 START TRANSACTION 또는 BEGIN 문을 사용하는 것입니다. 12.3.1 절“START TRANSACTION, COMMIT 및 ROLLBACK 구문”을 참조하십시오.

보다 구체적으로 말하면 "트랜잭션을 시작하는 또 다른 방법"은 "autocommit = 0"을 설정하면 트랜잭션을 시작하기에 충분하다는 것을 암시하는 것으로 보입니다 (적어도 세션 시작시 각 명령문 직전에 또는 COMMIT /ROLLBACK ). 트랜잭션이 시작되거나 끝나는 시점을 더 명확하게 볼 수 있기 때문에 어쨌든 명시 적으로 사용 BEGIN하거나 제안하는 것이 좋습니다 .START TRANSACTIONautocommit=0

트랜잭션을 시작하는 방법은 애플리케이션이 MySQL을 사용하는 방식에 따라 달라질 수 있습니다.


1
트랜잭션 프로토콜을 완전히 정의하려면 +1이 필요합니다.
RolandoMySQLDBA

@Bruno, "커밋"및 "롤백"이 작동하지 않는 MyISAM의 경우 인서트가 반 커밋되지 않습니까?
Pacerier

7

기본적으로 InnoDB는 autocommit = 1 또는 ON으로 설정되어 있습니다 있습니다. 일단 커밋되면 롤백 할 수 없습니다 .

앞으로 비활성화하려면 두 가지 중 하나를 수행해야합니다.

옵션 1 : 이것을 /etc/my.cnf에 추가하고 mysql을 다시 시작하십시오.

[mysqld]
autocommit=0

옵션 2 : 의미있는 SQL을 시작하기 전에 공개 DB 연결에서 이들 중 하나를 수행하십시오.

SET autocommit = 0;
START TRANSACTION;

이 두 옵션에서 수동 COMMIT 또는 수동 ROLLBACK 을 수행해야합니다. .

경고

표가 MyISAM이면 설명이 더 간단합니다. MyISAM 스토리지 엔진에 대한 트랜잭션이 없으므로 실행 된 모든 INSERT, UPDATE 및 DELETE는 영구적입니다. 롤백이 없습니다.


추가 설명을 위해 InnoDB 및 MyISAM 스토리지 엔진을 모두 대답합니다.
RolandoMySQLDBA

1
InnoDB에서 자동 커밋이 꺼져 있고 응용 프로그램이 쿼리 삽입을 시작하고 커밋을 실행하는 것을 잊어 버린 경우 변경 사항이 얼마나 빨리 손실됩니까?
RPK

각 INSERT 후에 응용 프로그램이 COMMIT를 수동으로 시작하면 작성되어 삭제할 수 없습니다. 커밋하기 전에 DB 연결이 종료되면 모든 변경 내용이 손실되고 롤백이 발생합니다. DDL (CREATE TABLE, DROP TABLE, ALTER TABLE 등)을 수행하거나 테이블 잠금을 수동으로 발행하면 INSERT가 자동 커미트됩니다. START TRANSACTION을 사용하면 커밋되지 않은 모든 변경 내용이 커밋됩니다.
RolandoMySQLDBA

1
"START TRANSACTION을 사용하면 커밋되지 않은 모든 변경 사항이 커밋됩니다." (DDL의 맥락에서 그렇지 않으면 롤백됩니다) 전에 암시 적 커밋 도 있습니다 (문서에 따라 버전 5.5.3 이후의 암시 적 커밋).
Bruno

1
"START TRANSACTION을 사용하면 커밋되지 않은 모든 변경 내용이 커밋됩니다." -시작 트랜잭션 이름, AUTOCOMMIT = 1, LOCK TABLES, UNLOCK TABLES, TRAUNCATE TABLE, RENAME TABLE, DROP INDEX, DROP TABLE이라는 이름의 MySQL 5.0 Certification Study Guide (ISBN 0-672-32812-7)에서 그 아이디어를 얻었습니다. "일부 상황에서 현재 트랜잭션이 암시 적으로 종료 될 수 있습니다. 다음 명령문 중 하나를 발행하면 InnoDB는 현재 트랜잭션의 커밋되지 않은 이전 명령문을 암시 적으로 커밋하고 시작합니다. 새로운 거래 ".
RolandoMySQLDBA
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.