이것은 이 관련 질문 에서 나왔습니다 . 사소한 경우 (둘 다 단일 행에서만 작동하는 경우)에 두 트랜잭션을 순차적으로 발생시키는 방법을 알고 싶었습니다. SELECT ... FOR UPDATE
두 트랜잭션의 첫 번째 줄로 사용하는 대답 이 있지만 문제가 발생합니다. 첫 번째 트랜잭션이 커밋되거나 롤백되지 않으면 두 번째 트랜잭션이 무기한 차단됩니다. innodb_lock_wait_timeout
변수는 두 번째 트랜잭션을 만들려고 노력하는 클라이언트가 "죄송합니다 다시 시도하십시오"말 것입니다 ...하지만 지금까지 내가 말할 수있는, 그들이 다음에 서버를 다시 부팅 할 때까지 다시 시도 할 것입니다 후 (초)을 설정합니다. 그래서:
ROLLBACK
거래가 영원히 진행 되는 경우 반드시 강제 할 수있는 방법이 있어야 합니까? 그런 트랜잭션을 죽이기 위해 데몬을 사용해야한다면, 그러한 데몬은 어떻게 생겼을까 요?- 연결이 트랜잭션에 의해 종료
wait_timeout
되거나interactive_timeout
중간 트랜잭션 인 경우 트랜잭션이 롤백됩니까? 콘솔에서 이것을 테스트하는 방법이 있습니까?
설명 : innodb_lock_wait_timeout
트랜잭션이 잠금이 해제 될 때까지 기다리는 시간 (초)을 설정합니다. 내가 원하는 것은 잠금을 해제 하는 방법입니다 .
업데이트 1 : 다음 innodb_lock_wait_timeout
은 두 번째 트랜잭션이 첫 번째 트랜잭션에 의해 차단되지 않는 이유를 보여주는 간단한 예입니다 .
START TRANSACTION;
SELECT SLEEP(55);
COMMIT;
기본 설정 인 innodb_lock_wait_timeout = 50
이 거래는 55 초 후에 오류없이 완료됩니다. 그리고 줄 UPDATE
앞에 before 를 추가 하고 같은 행 SLEEP
을 시도하는 다른 클라이언트에서 두 번째 트랜잭션을 시작하면 SELECT ... FOR UPDATE
잠자기 트랜잭션이 아닌 두 번째 트랜잭션입니다.
내가 찾고있는 것은이 거래의 편안한 파자마를 끝내는 방법입니다.
업데이트 2 : 위의 예가 얼마나 현실적인 지에 대한 hobodave의 우려에 부응하여 대체 시나리오는 다음과 같습니다. DBA가 라이브 서버에 연결하여 실행됩니다.
START TRANSACTION
SELECT ... FOR UPDATE
여기서 두 번째 줄은 응용 프로그램이 자주 쓰는 행을 잠급니다. 그런 다음 DBA가 중단되고 사라져 트랜잭션 종료를 잊어 버립니다. 행이 잠금 해제 될 때까지 응용 프로그램이 중지됩니다. 이 실수로 인해 응용 프로그램이 멈추는 시간을 최소화하고 싶습니다.
ROLLBACK
하는 데 n
몇 초 이상이 걸리면 첫 번째 트랜잭션 을 강제로 실행하고 싶습니다 . 그렇게 할 방법이 있습니까?
MYSQL
이 시나리오를 방지하기 위해 구성이없는 이유 가 궁금 합니다. 클라이언트의 무책임으로 인해 서버 중단이 허용되지 않기 때문입니다. 귀하의 질문을 이해하는 데 어려움이 없었으며 또한 관련이 있습니다.