반응형
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
반응형
'MySql' 카테고리의 다른 글
MySQL 쿼리에 'LIMIT 1'을 추가하면 결과가 1 개뿐이라는 것을 알고있을 때 쿼리가 더 빨라 집니까? (0) | 2020.10.26 |
---|---|
MySQL은 WHERE 조건이 여러 행에있는 테이블에서 하나의 필드를 선택합니다. (0) | 2020.10.25 |
MySQL mysql GROUP_CONCAT 중복 (0) | 2020.10.25 |
MySQL 제한 및 페이지 매김이있는 yii CActiveDataProvider (0) | 2020.10.25 |
MySQL-외래 키를 사용하여 여러 테이블에 삽입하는 방법 (0) | 2020.10.25 |
댓글