【初学者必見!】SQLの基本、実務使用例を徹底解説!LOCK TABLE編

LOCK TABLE SQL

※この記事にはプロモーションが含まれています。

ふりかえり

筆者
筆者

本記事は、SQLの基本、実務使用例編になります。

SQLの基礎に関しましては、

【初学者必見!】SQLの超基礎編の記事をご覧くださいませ。

A子
A子

本編に入ります!

LOCK TABLE とは?

SQL の LOCK TABLE は、テーブルに対してロック(鍵)をかけて、他のユーザーが同時に変更できないようにする命令です。

特に Oracle で使われることが多く、「今からこのテーブルを変更するので、他の人は一時的に変更しないで!」という意味です。


何のために使う?

  • データの整合性を守るため(他の人の操作とぶつからないようにする)
  • 複数のSQL操作を安全に実行したいとき
  • トランザクション中に他人の更新・削除を防ぎたいとき

🔓 ロックの種類(代表的な2つ)

ロック種類意味
IN SHARE MODE読み取り専用。他の人は更新できないが、読むことはできる
IN EXCLUSIVE MODE完全にロック。他の人は読むことも書くこともできない(更新・削除・挿入)

実務レベルの使用例を見ていこう!

筆者
筆者

実際に、SQLを使用してデータを確認していきましょう。

SQLに関しては以下を使用して解説していきます。

create table文、select文、insert文、update文、delete文、

drop table文、につきましては、過去にアップロードした

【初学者必見!】SQLの超基礎編の記事をご覧くださいませ。

A子
A子

目次の、「ふりかえり」のところにそれぞれの記事のリンクが

貼ってあるよ!

または、サイドバーのカテゴリーにSQLがあるから、そちらからでも

参照できます!

Oracle Live SQLで実行していきます!

今回、実行するSQLの一覧

テーブル作成

create table employees (
    employee_id number,
    name varchar2(50)
);

データ挿入

insert into employees (employee_id, name) values (1, '田中');
insert into employees (employee_id, name) values (2, '佐藤');
commit;

SELECT(通常の読み取り)

select * from employees;

LOCK TABLE を使ってロック

lock table employees in exclusive mode;

このSQLを実行すると、自分のトランザクションが終了(commitまたはrollback)するまで、他のユーザーはemployeesテーブルを変更できません。

注意点

不必要に長いロックは、他のユーザーに迷惑がかかるので避けましょう。

LOCK TABLE を使うときは、**トランザクション制御(commitrollback)**を忘れずに!

ロックの影響で、他の人のSQLが「待たされる(ブロックされる)」ことがあります。

実行の流れイメージ(まとめ)

-- トランザクション開始
lock table employees in exclusive mode;

update employees
   set name = '山田'
 where employee_id = 1;

-- 確定
commit;

この流れで、「山田」さんへの更新が安全に行えます。他のユーザーはその間更新できません。

SELECT FOR UPDATEと LOCK TABLEの違いは?

SELECT FOR UPDATELOCK TABLE はどちらも データを安全に扱うためにロックをかける命令ですが、目的と使い方に違いがあります。

違いの一覧表

項目SELECT FOR UPDATELOCK TABLE
ロック対象行(row)単位テーブル全体
目的更新対象の行だけをロックしたいテーブル全体をロックして他の人の操作を禁止したい
よく使う場面ある条件の行だけ更新したいときバッチ処理・一括更新など、他人の操作を一時的に完全に止めたいとき
他の人のアクセス読み取りは可能だが、ロックされた行の更新は不可テーブル全体の更新・挿入・削除ができなくなる(排他制御)
トランザクショントランザクション内で使用(commitが必要)トランザクション内で使用(commitが必要)
Oracleでの使用よく使う特定の用途で使う(強力なロック)

使用例で比較

SELECT FOR UPDATE の例(行ロック)

-- トランザクション開始
select * 
  from employees 
 where employee_id = 1 
   for update;

-- この行だけがロックされる
update employees 
   set name = '山田' 
 where employee_id = 1;

commit;

この場合、employee_id = 1 の行だけがロックされ、他の行は他のユーザーが操作できます。

LOCK TABLE の例(テーブル全体ロック)

-- トランザクション開始
lock table employees in exclusive mode;

-- 全行に影響する操作
update employees 
   set name = '山田' 
 where employee_id = 1;

commit;

この場合、employees テーブル全体がロックされるため、他のユーザーは読み書きできません。

まとめ

  • SELECT FOR UPDATEピンポイントでロック(行)
  • LOCK TABLEまとめてロック(テーブル)

通常は「必要最小限のロック」が望ましいため、行だけロックする SELECT FOR UPDATE のほうがよく使われます。

筆者
筆者

LOCK TABLEについて解説しました。

次回もお楽しみに!

この記事を書いた人
たくたく

文系出身・3年目のWeb系エンジニアです。
C#とSQLを得意としています。
同棲生活は2年目に入り、日々仲良く楽しく暮らしています。
プライベートではバイクや車で旅行に行くことが趣味です。
サンリオ好きで、中でもシナモン推しです。
お酒好きとして毎週の晩酌をリラックスタイムにしています。

たくたくをフォローする
SQLエンジニア
シェアする

コメント

タイトルとURLをコピーしました