두 가지 간단한 쿼리가 있습니다. 하나는 테이블을 읽는 것이고 다른 하나는 테이블을 업데이트하는 것입니다. 업데이트 쿼리가 실행되는 동안 선택 쿼리 읽기를 잠그는 방법. 이제 MySQL InnoDB에서는 쓰기/업데이트가 기본적으로 잠겨 있지만 읽기/선택은 트랜잭션 전에 오래된 데이터를 가져오는 것으로 나타났습니다.
업데이트 쿼리 내부에서 트랜잭션을 사용해 본 다음 SELECT ... FOR UPDATE
- 트랜잭션 외부에서 -을 사용해 보았으나 실패한 것 같습니다. 또한 테스트 목적으로 UPDATE 쿼리 속도를 늦추는 방법을 알고 싶습니다. SLEEP(X)를 발견했지만 업데이트 쿼리에서 이를 구현하는 방법을 모르겠습니다.
쓰기가 완료될 때까지 각 쿼리가 읽기/쓰기를 기다리게 하는 방법입니다.
P粉8771147982023-11-08 11:37:07
READ-COMMITTED
事务将查看最新提交的事务。更改,并使用SELECT ... LOCK IN SHARE MODE
를 사용하면 미해결 업데이트가 커밋될 때까지 읽기가 차단됩니다.
이것을 시도해 보세요. 한 화면에서 거래와 업데이트를 시작하세요. SLEEP()이 필요하지 않으며 트랜잭션이 커밋되지 않습니다. UPDATE로 생성된 잠금은 커밋할 때까지 계속 존재합니다.
으아아아아직 제출하지 마세요.
그동안 두 번째 화면에서는 트랜잭션 격리를 읽기-커밋 트랜잭션으로 설정합니다. InnoDB 쿼리는 자동 커밋되더라도 트랜잭션을 사용하므로 명시적인 트랜잭션을 시작할 필요가 없습니다.
으아아아공유 모드의 잠금은 업데이트로 생성된 뛰어난 단독 잠금이 아직 남아 있기 때문에 기다리게 합니다.
첫 번째 화면에서:
으아아아두 번째 화면에서는 짜잔! 차단 읽기는 차단을 해제하고 트랜잭션을 플러시하지 않고도 UDPATE 결과를 즉시 볼 수 있습니다.