SQL LOCK


# Table-Level Locking


### read lock
```typeLOCK TABLES table READ;UNLOCK TABLES;```


### write lock
```typeLOCK TABLES table WRITE;UNLOCK TABLES;```


# Row-Level Locking



주의 해야할것은 MySQL이 조회된 행을 기억하는 방법이 인덱스 범위를 기억하는 것이므로 조건 필드에 인덱스가 없으면 전체 테이블에 lock 이 걸립니다.
```typeSTART TRANSACTION;SELECT * FROM tb_stock WHERE id=1 FOR UPDATE;COMMIT;```

공유모드로 잠그면 다른 세션에서 읽기는 가능하고 수정, 삭제는 못하도록 할 수 있습니다

# Optimistic Lock



```typeSELECT quantity, opt_flag FROM tb_stock WHERE id = 1;UPDATE tb_stock SET quantity=quantity-1 WHERE quantity-1 >= 0 AND id = 1;```



> [MySQL locking - Table-Level Locking, Row-Level Locking, Optimistic Locking](https://offbyone.tistory.com/225)





