각 클라이언트가 동시에 작동하기 때문에 클라이언트가 연결 해제 된 직후 트랜잭션을 롤백하도록 MySQL 서버를 만들어야합니다.연결이 끊어진/연결이 끊어진 트랜잭션에서 MySQL 롤백
START TRANSACTION;
SELECT MAX(ID) FROM tblone FOR UPDATE;
#... lock wait time out will occur here
내가 설정 한
innodb_rollback_on_timeout
같은 MySQL의의 서버 옵션을 사용하여 : 클라이언트 B에
START TRANSACTION;
SELECT MAX(ID) FROM tblone FOR UPDATE;
#... then disconnect your connection to the server
:이 문제는 클라이언트 A에
(AN InnoDB의 테이블 유형을 사용하여) 다음과 같은 재현 할 수 있습니다 두 클라이언트 모두에서 mysql 클라이언트 mysql --skip-reconnect
. 네트워크에서 한 대의 서버와 두 대의 클라이언트를 사용하여이 작업을 시도했습니다. SELECT ... FOR UPDATE;
라인 이후에 물리적으로 네트워크 연결을 끊었습니다 (케이블을 뽑습니다). 다른 클라이언트가 즉시 트랜잭션 (잠금, 업데이트)에 tblone
을 사용할 수있게해야합니다. 그러면 클라이언트 A의 연결이 끊어진 후에 서버가 클라이언트 A에 대한 트랜잭션을 롤백해야한다고 생각합니다.
흥미로운 질문입니다. 나는 이것이 자동이라고 생각했다! 그래서 우리는'innodb_rollback_on_disconnect'와 같은 것을 필요로합니다. 그것은 좋을 것입니다. 그리고 저는 이것이 디폴트가되어야한다고 말하고 싶습니다! 그것은 mysql에 대한 합당한 변경 요청 일 것입니다. – TMS