우리의 응용 프로그램은 레코드를 추가하기 위해 INSERT 쿼리를 MySQL 데이터베이스에 시작합니다. 레코드가 자동 커밋되는지 여부를 알고 싶습니다. ROLLBACK 명령을 실행하면 데이터베이스는 언제 롤백을 수행합니까? COMMIT 후에 롤백이 가능합니까?
우리의 응용 프로그램은 레코드를 추가하기 위해 INSERT 쿼리를 MySQL 데이터베이스에 시작합니다. 레코드가 자동 커밋되는지 여부를 알고 싶습니다. ROLLBACK 명령을 실행하면 데이터베이스는 언제 롤백을 수행합니까? COMMIT 후에 롤백이 가능합니까?
답변:
귀하의 질문에 대한 답변은 귀하가 둘 이상의 거래 내역에 해당하는 거래에 있는지 여부에 따라 다릅니다. (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 TRANSACTION
autocommit=0
트랜잭션을 시작하는 방법은 애플리케이션이 MySQL을 사용하는 방식에 따라 달라질 수 있습니다.
기본적으로 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는 영구적입니다. 롤백이 없습니다.