ロック

■概要

ロックとはトランザクション中に他からSQLアクセスを受け付けないようにする仕組みのことです。
ロックを使用することでACID特性を考えた処理が実装できます。

■SQL

MySQLでロックを行うには「LOCK」「UNLOCK」を使用します。
この二つはワンセットになっているのでLOCKを実行したテーブルは必ずUNLOCKを行います。

●LOCK
	LOCK命令はロックを行うテーブルとロックの種類を指定することで、
	指定したテーブルをロックする命令です。

	・書式
		LOCK TABLES テーブル名 ロックの種類

	・具体例
		LOCK TABLES employee READ;

	・ロックの種類
		ロックにはREADとWRITEがあります。
		この2つの種類を使い分けてテーブルをロックします。

		・READ
			READ設定はロックを行ったテーブルに対しての
			書き込みを不可にし、読み込みのみを可能とします。
			これは、外からではなくロックを行った
			トランザクションも含まれます。

		・WRITE
			WRITE設定はロックを行ったテーブルに対して
			ロックを行ったトランザクションでは読み書きを許可し、
			外部からは読み書きを不可にします。

	・複数のテーブル同時指定
		LOCK命令では一度に複数のテーブルを同時に
		ロックすることができます。

		・書式
			LOCK TABLES テーブル名1 種類1, テーブル名2 種類2

		・具体例
			LOCK TABLES employee WRITE, official_post READ;

●UNLOCK
	UNLOCKは指定したロック状態のテーブルを指定します。

	・書式
		UNLOCK TABLES テーブル名

	・具体例
		UNLOCK TABLES employee;

■デッドロック

デッドロックとは2つ以上のトランザクション間で互いのテーブルの待ち
結果としてどちらのトランザクションも進まなくなってしまう状態のことです。

mysql_0009

上の図のようにトランザクションAではテーブル2をトランザクションBでは
テーブル1の解除を待っているので永遠に待機状態が続くことになります。