복붙노트

[SQL] MySQL의에서 SET 자동 커밋 = 1 START의 TRANSACTION의 차이는 (유무 내가 뭔가를 놓친?)

SQL

MySQL의에서 SET 자동 커밋 = 1 START의 TRANSACTION의 차이는 (유무 내가 뭔가를 놓친?)

그래서 여기 간다, 확실히 내가 제대로 그 이해 나는 MySQL은 거래에 독서 그리고 난 제대로 뭔가 특정을 파악하지하고 있는지 여부, 내가되고 싶어요. 난 그냥하지 않도록 내가 문 의미를 이해 여부 해요, 트랜잭션이 어떻게해야 뭔지 알아.

그래서, 내 질문은, 다음에 (그런 경우가 있다면, 무슨 일이며,), 아무것도 잘못된 것입니다 :

기본적으로 자동 커밋 모드는 MySQL의에서 사용할 수 있습니다.

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

START의 TRANSACTION; 것이다 기본적으로 SET 자동 커밋 = 0; 때까지 COMMIT; 또는 ROLLBACK; 일어난다.

즉, START의 TRANSACTION; 및 SET 자동 커밋은 = 0; 사실 그 시작의 TRANSACTION을 제외하고 동일합니다; 암시 SET 자동 커밋 = 0을 첨가 상응하며; 후 COMMIT; 또는 ROLLBACK;

그런 경우, 나는 http://dev.mysql.com/doc/refman/5.5/en/set-transaction.html#isolevel_serializable을 이해하지 못하는 - 격리 수준은 트랜잭션이 있음을 의미있는 것으로보고, 그 자동 커밋을 의미하는 것은 어쨌든 해제해야 하는가?

트랜잭션을 시작하고 자동 커밋 설정 사이 (위에서 설명한 이외의) 다른 차이가 있다면, 그것은 무엇인가?

해결법

  1. ==============================

    1.데이터베이스에 대한 처리 트랜잭션 (자동 커밋, 명시 적 및 암시)를 알고있는 것은 백업에서 데이터를 복원하는 수고를 덜 수 있습니다.

    데이터베이스에 대한 처리 트랜잭션 (자동 커밋, 명시 적 및 암시)를 알고있는 것은 백업에서 데이터를 복원하는 수고를 덜 수 있습니다.

    트랜잭션은 원자입니다 보장하기 위해 데이터 조작 문 (들)을 제어 할 수 있습니다. "원자"수단 인 트랜잭션 중 하나가 발생하거나하지 않습니다. 데이터베이스 트랜잭션의 완료를 신호하는 유일한 방법은 사용하는 것 중 하나 COMMIT 또는 ROLLBACK 문 (ANSI-92, 슬프게도 / 생성은 업체 고유의 것입니다 수 있도록 트랜잭션을 시작하기위한 구문을 포함하지 않았다 당). COMMIT는 트랜잭션 내에서의 변경 사항 (있는 경우)를 적용한다. 매우 바람직 대해 UPDATE / DELETE 문이 뭔가 의도하지 않는 경우 - 행동이 트랜잭션 내에서 일어난 어떤 롤백 무시합니다.

    일반적으로 개별 DML은 (삽입, 업데이트, 삭제) 문은 자동 커밋 트랜잭션에서 수행됩니다 - 그들은 문이 성공적으로 완료하자마자으로 최선을 다하고 있습니다. 어떤 수단 롤백 더 기회 이전에 귀하와 같은 경우에하고 실행을 갖는 문 상태로 데이터베이스가 없습니다. 뭔가 잘못 할 때 사용할 수있는 유일한 복원 옵션 (있는 제공) 백업에서 데이터를 재구성하는 것입니다. MySQL의에서 자동 커밋은 InnoDB에 대한 기본적으로 설정되어 있습니다 -의 MyISAM은 트랜잭션을 지원하지 않습니다. 그것은 사용하여 비활성화 할 수 있습니다 :

    SET autocommit = 0
    

    START의 TRANSACTION의 MySQL을 위해 - 문 (들)을 명시 적으로 정의 된 트랜잭션 코드 블록 내에서 포장 할 때 명시 적 트랜잭션입니다. 또한 트랜잭션의 끝에서 명시 적으로 COMMIT 또는 제작 ROLLBACK 문을 필요로한다. 중첩 된 트랜잭션은이 항목의 범위를 벗어납니다.

    암시 적 트랜잭션은 명시 적 것과 약간 다릅니다. 암시 적 트랜잭션은 트랜잭션을 정의하는 명시 적으로 요구하지 않습니다. 그러나, 그들은 필요한 명시 적 트랜잭션처럼은 COMMIT 또는 ROLLBACK 문을 제공 할 수 있습니다.

    명시 적 트랜잭션은 가장 이상적인 솔루션입니다 - 그들은 거래를 마무리, COMMIT 또는 ROLLBACK, 성명을 필요로하며, 어떤 일이 일어나고 것은 분명히 필요가 있어야 읽을 다른 사람을 위해 적혀있다. 암시 적 거래는 대화 형 데이터베이스로 작업하는 경우 OK, 그러나 결과는 테스트 및 철저하게 유효한 것으로 확인 된 이후에 문 만 지정해야 COMMIT.

    당신이 사용해야하는 것을 의미한다 :

    SET autocommit = 0;
    
    START TRANSACTION;
      UPDATE ...;
    

    ... 만 COMMIT 사용; 결과는 정확합니다.

    즉 UPDATE 및 DELETE 문은 일반적으로 특정 세부 사항이 아닌 영향을받는 행의 수를 반환했다. SELECT 문에 이러한 내용을 변환 &는 UPDATE / DELETE 문을 시도하기 정확성 전에 확인 결과를 검토합니다.

    DDL (데이터 정의 언어) 문이 자동으로 최선을 다하고 있습니다 - 그들은 COMMIT 문을 필요로하지 않습니다. IE : 테이블, 인덱스, 저장 프로 시저, 데이터베이스, 뷰 생성 또는 변경 문.

  2. ==============================

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

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

    당신은 SET AUTOCOMMIT = 0을 사용할 수 있습니다; 이노에 대한 아니라 정확하게 거래를위한, 테스트 목적.

    의 MyISAM에서는 START 거래를하지 않아도 ;. 이 엔진에서 사용 SET의 AUTOCOMMIT = 0; 거래합니다. COMMIT와 커밋; 또는 SET AUTOCOMMIT = 1; (차이는 아래의 MyISAM 예 해설에서 설명). 당신도 이노에 거래를 이런 식으로 할 수 있습니다.

    출처 : 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 */
    
  3. ==============================

    3.당신은 롤백을 사용하려면, 다음 트랜잭션을 시작 사용 MySQL은 기본적으로 1로 자동 커밋을 설정하기 때문에, 그렇지 않으면 그 모든 일을 잊어 버려.

    당신은 롤백을 사용하려면, 다음 트랜잭션을 시작 사용 MySQL은 기본적으로 1로 자동 커밋을 설정하기 때문에, 그렇지 않으면 그 모든 일을 잊어 버려.

  4. ==============================

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

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

    사용 LOCK 테이블과 같은 InnoDB 테이블과 같은 트랜잭션 테이블과 UNLOCK 테이블에 올바른 방법은 트랜잭션을 커밋 할 때까지, 그리고 전화 잠금 해제 테이블에 LOCK TABLES를 다음 SET 자동 커밋 = 0 (하지 START의 TRANSACTION)와 트랜잭션을 시작하는 것입니다 명시 적으로. 당신이 테이블 t1을 작성해야하고 테이블 T2에서 읽을 경우 예를 들어, 당신은이 작업을 수행 할 수 있습니다 :

    SET autocommit=0;
    LOCK TABLES t1 WRITE, t2 READ, ...;... do something with tables t1 and t2 here ...
    COMMIT;
    UNLOCK TABLES;
    
  5. from https://stackoverflow.com/questions/2950676/difference-between-set-autocommit-1-and-start-transaction-in-mysql-have-i-misse by cc-by-sa and MIT license