MySQL: 자동 커밋 플래그가 켜져 있지만 트랜잭션이 롤백될 수 있습니다.
MariaDB 버전을 사용하고 있습니다.10.3.13
마지막으로 확인했을 때autocommit
플래그가 켜져 있습니다.
MariaDB> SHOW VARIABLES WHERE Variable_name='autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
문서에서 읽은 바와 같이 자동 커밋이 켜져 있으면 여기에 명시된 대로 트랜잭션을 롤백할 수 없습니다.
기본적으로 MySQL은 자동 커밋 모드를 사용하도록 설정된 상태로 실행됩니다.즉, 테이블을 업데이트(수정)하는 문을 실행하는 즉시 MySQL이 업데이트를 디스크에 저장하여 영구적으로 만듭니다.변경 내용을 롤백할 수 없습니다.
그래서 저는 테스트를 위해 작은 대본을 씁니다.먼저 트랜잭션을 시작하고 몇 가지 데이터를 업데이트합니다.
BEGIN;
UPDATE foo SET year = 2019 WHERE id = 1;
Query OK, 1 row affected (0.000 sec)
Rows matched: 1 Changed: 1 Warnings: 0
그래서 내가 한 것처럼 보인다.다음으로 롤백합니다.
ROLLBACK;
Query OK, 0 rows affected (0.005 sec)
그런 다음 업데이트된 기록을 다시 확인해보니 데이터가 변경되지 않았습니다.이상하다. 왜냐하면 데이터는 항상 바뀌기 때문이다.왜냐하면autocommit
플래그가 켜져 있습니다.
이유를 설명해 주세요.감사해요.
라 할지라도autocommit
켜짐(사용하는 경우BEGIN
또는START TRANSACTION
트랜잭션이 완료될 때까지 각 스테이트먼트의 자동 커밋을 일시 정지합니다.
매뉴얼 페이지(https://dev.mysql.com/doc/refman/8.0/en/commit.html,)를 인용했습니다.이 페이지에는 다음 내용이 설명되어 있습니다.
단일 스테이트먼트의 자동 커밋모드를 암묵적으로 디세블로 하려면 START TRANSACTION 스테이트먼트를 사용합니다.
START TRANSACTION을 사용하면 자동 커밋은 COMMIT 또는 Rollback으로 트랜잭션을 종료할 때까지 비활성화 상태로 유지됩니다.다음으로 자동 커밋모드는 이전 상태로 돌아갑니다.
(내 것을 제외)
즉, 다음에 실행하는 스테이트먼트는BEGIN
또는START TRANSACTION
는 자동으로 커밋되지 않습니다.이것은 예상된 것입니다.
BEGIN
트랜잭션의 명시적 시작이며, 이 경우 에 영향을 주지 않습니다.autocommit
.
자동 커밋은 명시적으로 트랜잭션되지 않은 SQL에 적용됩니다.
앞의 답변은 맞지만, 다른 각도로 설명하겠습니다.
10억 줄에 달하면UPDATE
(몇 시간 걸립니다), 컴퓨터의 플러그를 뽑으면UPDATE
부분 종료됩니다.컴퓨터(및 MySQL)를 재부팅하면 어떻게 됩니까?MyISAM에서는 일부 행이 갱신되고 일부 행은 갱신되지 않습니다.하지만 InnoDB를 통해ROLLBACK
부분적으로 끝난 것UPDATE
(몇 시간 더 걸릴 수 있습니다).
따라서 매뉴얼에서 인용한 내용은 (다른 답변에서 지적한 바와 같이) 모호할 뿐만 아니라 '문자 그대로' 부정확했습니다.이 예에서는 변경을 롤백할 수 있습니다.
나는 이렇게 말하고 싶다.
Autocommit=ON
되지 않는 는를 「따라서」, 「따라서」, 「따라서」로 것과 .BEGIN
★★★★★★★★★★★★★★★★★」COMMIT
이
저는 http://bugs.mysql.com/95414을 신청했습니다.
언급URL : https://stackoverflow.com/questions/55942939/mysql-autocommit-flag-is-on-but-transaction-still-can-rollback
'programing' 카테고리의 다른 글
Vue router-link 완전 액티브클래스 (0) | 2022.10.06 |
---|---|
Python 3.7 데이터 클래스 상속 (0) | 2022.10.06 |
Java 로깅 출력을 한 줄에 표시하려면 어떻게 해야 합니까? (0) | 2022.10.06 |
PHP exec() vs system() vs 패스스루() (0) | 2022.09.29 |
int(11)와 int(11) UNSIGNARED의 차이점은 무엇입니까? (0) | 2022.09.29 |