2014-02-25 4 views
0

MySQL InnoDB에 대한 질문이 있습니다. 예 : 트랜잭션을 시작하는 스레드 A가 있습니다.MySQL 잠금에 대해 혼란 스럽습니다

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

mysql> update user set name = "Jim" where id = 1; 
Query OK, 1 row affected (0.00 sec) 
Rows matched: 1 Changed: 1 Warnings: 0 

그런 다음 스레드 A를 그대로 두십시오. 스레드 A는 해당 행에 'X'잠금을 넣어 때문에,

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 

그것은 의미가 있습니다 :이 작업을 수행하는 다른 스레드 B 시작 :

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

mysql> update user set name = "Tom" where id = 1; 

을 그리고 나는 오류가 발생했습니다.

그리고 나는이 작업을 수행하는 스레드 B를 사용 :

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

mysql> select * from user where id = 1; 
+----+------+ 
| id | name | 
+----+------+ 
| 1 | wlq3 | 
+----+------+ 
1 row in set (0.00 sec) 

가 여기에 내가 혼란 스러워요. 마찬가지로 나는 스레드 A가 그 행에 'X'자물쇠를 넣었다 고 말했다. 스레드 B가이 행을 읽을 수있는 이유. 필자의 견해로는 독서 데이터에는 공유 잠금이 필요하지만 독점 잠금은 이미 해당 데이터에 있습니다. 아무도 저를 도울 수 있습니까, 고마워요!

그런데 스레드 A의 격리 수준은 반복 가능한 읽기이며 스레드 B는 커밋 된 읽기입니다.

답변

1

wlq3은 데이터베이스에서 커밋 된 값이므로 트랜잭션 B는이 값을 읽습니다. Jim의 업데이트는 아직 커밋되지 않았습니다. 잠금은 읽기를 차단하지 않습니다. 이는 업데이트를 막을 것입니다. 이는 InnoDB에 구현 된 MVCC 잠금 모델 때문입니다.

자세한 내용은 다음 링크를 참조하십시오. InnoDB's row locking the same as MVCC Non-Blocking Reads?

관련 문제