본문 바로가기
MySql

MySQL 업데이트 용 MySQL

by 베이스 공부 2020. 10. 25.
반응형

MySQL은 "for update"키워드를 지원합니다. 예상대로 작동하는지 테스트 한 방법은 다음과 같습니다. 2 개의 브라우저 탭을 열고 하나의 창에서 다음 명령을 실행했습니다.

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from myxml where id = 2 for update;
....
mysql> update myxml set id = 3 where id = 2 limit 1;
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> commit;
Query OK, 0 rows affected (0.08 sec)

다른 창에서 트랜잭션을 시작하고 동일한 레코드에 대해 업데이트 잠금을 시도했습니다.

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from myxml where id = 2 for update;
Empty set (43.81 sec)

위의 예에서 알 수 있듯이, 창 1 번에서 다른 어플리케이션에서 거래가 진행 중이 어서 43 초 동안 레코드를 선택할 수 없었습니다. 거래가 끝나면 레코드를 선택해야하는데 ID가 먼저 실행 된 트랜잭션에 의해 2가 id 3으로 변경 되었으나 레코드가 반환되지 않았습니다.

내 질문은 "업데이트 용"구문을 사용할 때의 단점은 무엇입니까? 창 1에서 실행중인 트랜잭션을 커밋하지 않으면 레코드가 영원히 잠기나요?

 

해결 방법

 

예, 트랜잭션 # 1이 커밋되지 않으면 연결이 끊어 지거나 innodb가 교착 상태 감지로 인해 트랜잭션을 롤백하기로 결정하지 않는 한 해당 레코드는 영원히 잠 깁니다.

하지만 아이디 2가 아이디 3으로 바뀌 었으니 by the transaction that was executed 첫째, 레코드가 반환되지 않았습니다.


 

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

 

 

반응형

댓글