본문 바로가기
MySql

MySQL 연결이 끊어 지거나 연결이 끊어진 트랜잭션에서 MySQL 롤백

by 베이스 공부 2020. 9. 18.
반응형

각 클라이언트가 동시에 작동하기 때문에 클라이언트 연결이 끊어진 직후 트랜잭션을 롤백하도록 MySQL 서버를 만들어야합니다. 문제는 다음과 같이 재현 할 수 있습니다 (innodb 테이블 유형 사용).

클라이언트 A :

START TRANSACTION;
SELECT MAX(ID) FROM tblone FOR UPDATE;
#... then disconnect your connection to the server

클라이언트 B에서 :

START TRANSACTION;
SELECT MAX(ID) FROM tblone FOR UPDATE;
#... lock wait time out will occur here

innodb_rollback_on_timeout 과 같은 MySQL의 서버 옵션을 설정하고 두 클라이언트에서 mysql의 클라이언트 mysql --skip-reconnect 를 사용했습니다. 나는 네트워크에서 하나의 서버와 두 개의 클라이언트를 사용하여 이것을 시도했습니다. SELECT ... FOR UPDATE; 라인 이후에 물리적으로 네트워크 연결을 끊었습니다 (케이블 분리). 다른 클라이언트가 트랜잭션에서 tblone 을 즉시 사용할 수 있도록해야합니다 (잠금, 업데이트). 그러려면 서버가 클라이언트 A의 트랜잭션을 롤백해야한다고 생각합니다. A 연결이 끊어집니다.

 

해결 방법

 

클라이언트를 물리적으로 연결 해제 할 때 정상적인 연결 해제 (롤백이 발생했을 수 있음)를 보내지 않고 MySQL 프로토콜이 수다스럽지 않으므로 서버는 클라이언트가 없다는 사실을 알 수 없습니다. 클라이언트와 서버가 내부적으로 훨씬 더 많이 대화하는 다른 데이터베이스 시스템과 비교할 때 이것이 프로토콜의 결함이라고 생각합니다.

어쨌든. 변경할 수있는 두 가지 변수가 있습니다. 기본적으로 동일하지만 다른 클라이언트에 대해 수행합니다.



두 경우 모두 서버는 몇 초 후에 연결을 종료하고 그렇게 할 때 모든 트랜잭션을 롤백하고 모든 잠금을 해제합니다.

 

참조 페이지 https://stackoverflow.com/questions/9936699

 

 

반응형

댓글