2014-11-17 2 views
0

현재 MySQL의 트랜잭션 및 잠금 기능에 대해 배우고 있습니다.MySQL - 트랜잭션 및 잠금의 상호 배제?

격리 수준이 SERIALIZABLE 인 트랜잭션과 동일한 테이블에서 LOCKUNLOCK 문 사이의 문이 상호 배타적으로 실행됩니까?


편집 1 : 격리 수준 SERIALIZABLE와 트랜잭션 우선,이 트랜잭션이 실제로 상호 배타적이거나 단지 어떤 팬텀과 같은 요구 사항이 충족 읽기 여부를 확인도 가능하다? 또는이 두 속성이 동일한 동작을 함축합니까?


편집 2 : 아, 그리고 읽기 현상이 실제로 일어날 수 있도록 실제로 같은 데이터 작업을 두 개 이상의 거래의 경우 활성 트랜잭션의 주어진 격리 수준을 제공하는 메커니즘은 무엇입니까?

답변

0

InnoDB에서 모든 SERIALIZABLE은 SELECT을 암시 적 SELECT...LOCK IN SHARE MODE으로 바꿉니다. 따라서 이것은 동일한 행 (들)에 대한 INSERT/UPDATE/DELETE에만 영향을 미칩니다.

당신은 SHOW 엔진 INNODB 상태에서 잠금을 관찰 할 수있다 :

---TRANSACTION 14594, ACTIVE 5 sec 
2 lock struct(s), heap size 360, 8 row lock(s) 
MySQL thread id 24, OS thread handle 0x7f65c8624700, query id 324 192.168.56.1 root cleaning up 
TABLE LOCK table `imdb`.`kind_type` trx id 14594 lock mode IS 
RECORD LOCKS space id 24 page no 4 n bits 80 index `kind` of table `imdb`.`kind_type` trx id 14594 lock mode S 

내가 한 모든 tx_isolation = SERIALIZABLE과 autcommit = 0을 설정 한 후 SELECT * FROM imdb.kind_type했다.

LOCK TABLES kind_type WRITE을 차단하는 IS 테이블 잠금이 있음을 알 수 있습니다.

하지만 트랜잭션 자동 커밋 모드를 실행 중이면 그렇게하지 않습니다. REPEATABLE-READ처럼 행동합니다.

+0

격리 된 트랜잭션의 인과 관계는 어떻습니까? 하나의 트랜잭션이 데이터로 무언가를 수행하고 다른 세션이 트랜잭션에서도 트랜잭션을 수행하지 않는다면 읽기 현상 요구 사항은 여전히 ​​충족됩니까? – MinecraftShamrock

+0

명시 적으로 시작/커밋하거나 자동 커밋을 사용하든 관계없이 InnoDB의 모든 것이 트랜잭션에있다. 두 경우 모두 트랜잭션 격리에 따릅니다. –