MySQLでは、トランザクションの際に異なるロック隔離レベルを選択することができます。これらのレベルには、トランザクション同士がどのように相互作用するかに関するルールがあります。以下に、それぞれのロック隔離レベルの違いと、具体的なコード例を示します。
1. READ COMMITTED(デフォルト)
この隔離レベルでは、コミットされたデータのみが他のトランザクションに見えます。未コミットのデータは他のトランザクションには見えません。
-- トランザクション開始
START TRANSACTION;
-- データの読み込み
SELECT * FROM users WHERE age > 25;
-- 他のトランザクションからの変更が反映されない
-- トランザクション終了
COMMIT;
2. REPEATABLE READ
この隔離レベルでは、トランザクション内で同じクエリを実行しても、結果が変わらないようになります。他のトランザクションからの変更も見えません。
-- トランザクション開始
START TRANSACTION;
-- データの読み込み
SELECT * FROM products WHERE stock > 0;
-- 別のトランザクションで在庫を減らすが、このトランザクション内では見えない
-- トランザクション終了
COMMIT;
3. SERIALIZABLE
最も厳格な隔離レベルで、トランザクション同士が完全に独立しています。他のトランザクションの変更が見えませんし、同じデータに対する同時の変更も許されません。
-- トランザクション開始
START TRANSACTION;
-- データの読み込み
SELECT * FROM orders WHERE status = 'pending' FOR UPDATE;
-- 他のトランザクションで同じ行を更新しようとすると、待たされる
-- トランザクション終了
COMMIT;
これらのロック隔離レベルを適切に選択することで、データベースの一貫性を確保し、同時実行性能を最適化することができます。