각 클라이언트가 동시에 작동하기 때문에 클라이언트 연결이 끊어진 직후 트랜잭션을 롤백하도록 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
'MySql' 카테고리의 다른 글
MySQL 유효한 제약 조건이있는 "SQLSTATE [23000] : 무결성 제약 조건 위반" (0) | 2020.09.18 |
---|---|
MySQL 사용자가 데이터베이스를 생성하려면 어떤 권한이 필요합니까? (0) | 2020.09.18 |
MySQL Jdbc 드라이버를 찾을 수 없음 (0) | 2020.09.18 |
MySQL Yii : CDbCriteria를 사용하여 GROUP BY 전에 ORDER BY하는 방법은 무엇입니까? (0) | 2020.09.18 |
MySQLi 준비된 문의 결과를 연관 배열에 어떻게 넣을 수 있습니까? (0) | 2020.09.18 |
댓글