<!--
$Header: /usr/prj/pg/cvsroot/doc/doc/src/sgml/ref/lock.sgml,v 1.3 2001/09/13 04:33:43 k-kondo Exp $
Postgres documentation
-->

<refentry id="SQL-LOCK">
 <refmeta>
  <refentrytitle id="sql-lock-title">
   LOCK
  </refentrytitle>
  <refmiscinfo>SQL<!-- Language Statements -->言語</refmiscinfo>
 </refmeta>
 <refnamediv>
  <refname>
   LOCK
  </refname>
  <refpurpose>
   <!-- Explicitly lock a table inside a transaction -->
   トランザクション内部でテーブルを明示的にロックします。<indexterm><primary>LOCK</primary></indexterm><indexterm><primary>SQL</primary><secondary>LOCK</secondary></indexterm><indexterm><primary sortas="とらんざくしょん">トランザクション</primary><secondary sortas="てーぶるのろっく">テーブルのロック</secondary></indexterm><indexterm><primary sortas="てーぶる">テーブル</primary><secondary sortas="ろっく">ロック</secondary></indexterm>
  </refpurpose>
 </refnamediv>
 <refsynopsisdiv>
  <refsynopsisdivinfo>
   <date>1999-07-20</date>
  </refsynopsisdivinfo>
<synopsis>
LOCK [ TABLE ] <replaceable class="PARAMETER">name</replaceable>
LOCK [ TABLE ] <replaceable class="PARAMETER">name</replaceable> IN [ ROW | ACCESS ] { SHARE | EXCLUSIVE } MODE
LOCK [ TABLE ] <replaceable class="PARAMETER">name</replaceable> IN SHARE ROW EXCLUSIVE MODE
</synopsis>

  <refsect2 id="R2-SQL-LOCK-1">
   <refsect2info>
    <date>1999-06-09</date>
   </refsect2info>


   <title>
    <!-- Inputs -->入力
   </title>

    <variablelist>
     <varlistentry>
      <term><replaceable class="PARAMETER">name</replaceable></term>
      <listitem>
       <para>
	<!-- The name of an existing table to lock. -->
        ロックを行う既存テーブルの名前です。

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term>ACCESS SHARE MODE</term>
      <listitem>
       <note>
	<para>
         <!--
	 This lock mode is acquired automatically over tables being queried.
         -->
         このモードでは問い合わせが行われるテーブル全体のロックを自動的に獲得します。<indexterm><primary sortas="とらんざくしょん">トランザクション</primary><secondary>ACCESS SHARE MODE</secondary></indexterm>

	</para>
       </note>

       <para>
        <!--
	This is the least restrictive lock mode.  It conflicts only with
	ACCESS EXCLUSIVE mode. It is used to protect a table from being
	modified by concurrent <command>ALTER TABLE</command>, 
	<command>DROP TABLE</command> and <command>VACUUM</command> 
	commands. -->

        これは、最も制限の弱いロックモードです。ACCESS EXCLUSIVEモードとのみ競合します。あるテーブルに対する<command>ALTER TABLE</command>、<command>DROP TABLE</command>、<command>VACUUM</command>コマンドの同時実行からそのテーブルを保護するために使われます。

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term>ROW SHARE MODE</term>
      <listitem>
       <note>
       <para>
         <!--
	 Automatically acquired by <command>SELECT...FOR UPDATE</command>.
	 While it is a shared lock, may be upgraded later to a ROW EXCLUSIVE
         lock. -->

         <command>SELECT...FOR UPDATE</command>によって自動的に獲得されます。共有ロックといっても、後でROW EXCLUSEIVEロックにアップグレードすることができます。<indexterm><primary sortas="とらんざくしょん">トランザクション</primary><secondary>ROW SHARE MODE</secondary></indexterm>

	</para>
       </note>

       <para>
        <!--
	Conflicts with EXCLUSIVE and ACCESS EXCLUSIVE lock modes. -->

        EXCLUSIVEとACCESS EXCLUSIVEのロックモードに競合します。

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term>ROW EXCLUSIVE MODE</term>
      <listitem>
       <note>
	<para>
         <!--
	 Automatically acquired by <command>UPDATE</command>,
	 <command>DELETE</command>, and <command>INSERT</command>
	 statements. -->

         <command>UPDATE</command>、<command>DELETE</command>、<command>INSERT</command>文によって自動的に獲得されます。<indexterm><primary sortas="とらんざくしょん">トランザクション</primary><secondary>ROW EXCLUSIVE MODE</secondary></indexterm>

        </para>
       </note>

       <para>
	<!-- Conflicts with SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE and
	 ACCESS EXCLUSIVE modes. -->

         SHARE、SHARE ROW EXCLUSIVE、EXCLUSIVE、ACCESS EXCLUSIVEモードに競合します。

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term>SHARE MODE</term>
      <listitem>
       <note>
       <para>
         <!--
	 Automatically acquired by <command>CREATE INDEX</command>.
	 Share-locks the entire table. -->

         <command>CREATE INDEX</command>によって自動的に獲得されます。テーブル全体を共有ロックします。<indexterm><primary sortas="とらんざくしょん">トランザクション</primary><secondary>SHARE MODE</secondary></indexterm>

       </para>
       </note>

       <para>
        <!--
	Conflicts with ROW EXCLUSIVE, SHARE ROW EXCLUSIVE, EXCLUSIVE and
	ACCESS EXCLUSIVE modes. This mode protects a table against
	concurrent updates. -->

        ROW EXCLUSIVE、SHARE ROW EXCLUSIVE、EXCLUSIVE、ACCESS EXCLUSIVEモードに競合します。このモードは同時更新からテーブルを保護します。

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term>SHARE ROW EXCLUSIVE MODE</term>
      <listitem>
       <note>
       <para>
	<!-- This is like EXCLUSIVE MODE, but allows SHARE ROW locks
        by others. -->

        これはEXCLUSIVE MODEのようなものですが、他からのSHARE ROWロックを許可します。<indexterm><primary sortas="とらんざくしょん">トランザクション</primary><secondary>SHARE ROW EXCLUSIVE MODE</secondary></indexterm>

       </para>
       </note>

       <para>
        <!--
        Conflicts with ROW EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE,
	EXCLUSIVE and ACCESS EXCLUSIVE modes. -->

        ROW EXCLUSIVE、SHARE、SHARE ROW EXCLUSIVE、EXCLUSIVE、ACCESS EXCLUSIVEモードに競合します。

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term>EXCLUSIVE MODE</term>
      <listitem>

       <note>
       <para>
        <!--
	This mode is yet more restrictive than SHARE ROW EXCLUSIVE.
	It blocks all concurrent ROW SHARE/SELECT...FOR UPDATE queries.
        -->

        SHARE ROW EXCLUSIVEよりもさらに制限の強いモードです。すべての同時ROW SHARE/SELECT...FOR UPDATE問い合わせをブロックします。<indexterm><primary sortas="とらんざくしょん">トランザクション</primary><secondary>EXCLUSIVE MODE</secondary></indexterm>

       </para>
       </note>

       <para>
        <!--
	Conflicts with ROW SHARE, ROW EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE,
	EXCLUSIVE and ACCESS EXCLUSIVE modes. -->

        ROW SHARE、ROW EXCLUSIVE、SHARE、SHARE ROW EXCLUSIVE、EXCLUSIVE、ACCESS EXCLUSIVEモードに競合します。

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term>ACCESS EXCLUSIVE MODE</term>
      <listitem>
       <note>
	<para>
         <!--
	 Automatically acquired by <command>ALTER TABLE</command>,
	 <command>DROP TABLE</command>, <command>VACUUM</command> statements.
	 This is the most restrictive lock mode which conflicts with all other
	 lock modes and protects a locked table from any concurrent operations.
         -->

         <command>ALTER TABLE</command>、<command>DROP TABLE</command>、<command>VACUUM</command>文から自動的に獲得されます。これは最も制限の強いロックモードで、他のすべてのロックモードと競合し、同時に起こるすべての操作からロックしたテーブルを保護します。<indexterm><primary sortas="とらんざくしょん">トランザクション</primary><secondary>ACCESS EXCLUSIVE MODE</secondary></indexterm>

	</para>
       </note>

       <note>
	<para>
	<!-- This lock mode is also acquired by an unqualified
	 <command>LOCK TABLE</command> (i.e., the command without an explicit
	 lock mode option). -->

         このロックモードは条件を持たない（明示的なロックモードオプションが付いていない）<command>LOCK TABLE</command>によっても獲得されます。

	</para>
       </note>
      </listitem>
     </varlistentry>
    </variablelist>
  </refsect2>

  <refsect2 id="R2-SQL-LOCK-2">
   <refsect2info>
    <date>1998-09-24</date>
   </refsect2info>
   <title>
    <!-- Outputs -->出力
   </title>

    <variablelist>
     <varlistentry>
      <term><computeroutput>
LOCK TABLE
       </computeroutput></term>
      <listitem>
       <para>
	<!-- The lock was successfully applied. -->
        ロックの適用に成功した場合に返されます。

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term><computeroutput>
ERROR <replaceable class="PARAMETER">name</replaceable>: Table does not exist.
       </computeroutput></term>
      <listitem>
       <para>
        <!--
	Message returned if <replaceable class="PARAMETER">name</replaceable>
	does not exist. -->

        <replaceable class="PARAMETER">name</replaceable>が存在しない場合に返されるメッセージです。

       </para>
      </listitem>
     </varlistentry>
    </variablelist>
  </refsect2>
 </refsynopsisdiv>

 <refsect1 id="R1-SQL-LOCK-1">
  <refsect1info>
   <date>1998-09-24</date>
  </refsect1info>
  <title>
   <!-- Description -->説明
  </title>

  <para>
   <!--
   <command>LOCK TABLE</command> controls concurrent access to a table
   for the duration of a transaction.
   <productname>Postgres</productname> always uses the least restrictive
   lock mode whenever possible. <command>LOCK TABLE</command>
   provides for cases when you might need more restrictive locking. -->

   <command>LOCK TABLE</command>は、トランザクションの期間内においてテーブルへの同時アクセスを制御します。<productname>Postgres</productname>は、可能なときは常に最も制限の弱いロックモードを使います。<command>LOCK TABLE</command>はより制限の強いロックが必要な場合のために用意されています。

  </para>

  <para>
   <!--
   <acronym>RDBMS</acronym> locking uses the following terminology:
   -->

   <acronym>RDBMS</acronym>ロックは以下の用語を使います。
</para>

   <variablelist>
    <varlistentry>
     <term>EXCLUSIVE</term>
     <listitem>
      <para>
       <!--
       Exclusive lock that prevents other locks from being granted.
       -->

       他のロックに権限が認められないようにするための排他的ロックです。<indexterm><primary sortas="とらんざくしょん">トランザクション</primary><secondary>EXCLUSIVE</secondary></indexterm>

      </para>
     </listitem>
    </varlistentry>

    <varlistentry>
     <term>SHARE</term>
     <listitem>
      <para>
       <!--
       Allows others to share lock.  Prevents EXCLUSIVE locks. -->

       他の人がロックを共有することを認めます。EXCLUSIVEロックを無効にします。<indexterm><primary sortas="とらんざくしょん">トランザクション</primary><secondary>SHARE</secondary></indexterm>

      </para>
     </listitem>
    </varlistentry>

    <varlistentry>
     <term>ACCESS</term>
     <listitem>
      <para>
       <!-- Locks table schema. -->
       テーブルスキーマをロックします。
      </para>
     </listitem>
    </varlistentry>

    <varlistentry>
     <term>ROW</term>
     <listitem>
      <para>
       <!-- Locks individual rows. -->
       個々の行をロックします。<indexterm><primary sortas="とらんざくしょん">トランザクション</primary><secondary>ROW</secondary></indexterm>
      </para>
     </listitem>
    </varlistentry>
   </variablelist>

   <note>
    <para>
     <!--
     If EXCLUSIVE or SHARE are not specified, EXCLUSIVE is assumed.
     Locks exist for the duration of the transaction. -->

     EXCLUSIVEまたはSHAREが指定されない場合、EXCLUSIVEであると仮定されます。ロックはトランザクション期間全体にわたって存在します。

    </para>
   </note>

  <para>
   <!--
   For example, an application runs a transaction at READ COMMITTED isolation
   level and needs to ensure the existence of data in a table for the
   duration of the
   transaction. To achieve this you could use SHARE lock mode over the
   table before querying. This will protect data from concurrent changes
   and provide any further read operations over the table with data in their
   actual current state, because SHARE lock mode conflicts with any ROW EXCLUSIVE
   one acquired by writers, and your
   <command>LOCK TABLE <replaceable class="PARAMETER">name</replaceable> IN SHARE MODE</command>
   statement will wait until any concurrent write operations commit or rollback.
   -->

    たとえば、アプリケーションが隔離レベルREAD COMMITTEDでトランザクションを実行し、そのトランザクションの期間中テーブルにデータが存在することを確実にする必要がある場合を考えてみます。これを達成するために、問い合わせ実行前にテーブル全体にSHAREロックモードを使用することができます。これは同時変更からデータを保護し、現在の実状態を維持したテーブル全体に対して読み取り操作を今後行うことができます。SHAREロックモードは、書き込み側によって獲得されるあらゆるROW EXCLUSIVEと競合し、<command>LOCK TABLE <replaceable class="PARAMETER">name</replaceable> IN SHARE MODE</command>文は同時書き込み操作のコミットまたはロールバックが終わるまで待つからです。
</para>

   <note>
    <para>
     <!--
     To read data in their real current state when running a transaction
     at the SERIALIZABLE isolation level you have to execute a LOCK TABLE
     statement before executing any DML statement, when the transaction defines
     what concurrent changes will be visible to itself. -->

     トランザクションが隔離レベルSERIALIZABLEで実行しているときに現在の実状態のデータを読むためには、何らかのDML文を実行するより前にLOCK TABLE文を実行する必要があります。このとき、そのトランザクションはどんな同時変更を自身で認識できるかを定義します。<indexterm><primary sortas="とらんざくしょん">トランザクション</primary><secondary>SERIALIZABLE</secondary></indexterm>

    </para>
   </note>

  <para>
   <!--
   In addition to the requirements above, if a transaction is going to
   change data in a table, then SHARE ROW EXCLUSIVE lock mode should
   be acquired to prevent deadlock conditions when two concurrent
   transactions attempt to lock the table in SHARE mode and then
   try to change data in this table, both (implicitly) acquiring
   ROW EXCLUSIVE lock mode that conflicts with a concurrent SHARE lock.
   -->

   上の要求事項に加え、トランザクションがテーブル内のデータを変更する予定であるならば、SHARE ROW EXCLUSIVEロックモードを獲得して、次のデッドロック状態を防止しなければなりません。2つの同時トランザクションがテーブルをSHAREモードでテーブルをロックし、そしてテーブル内のデータを変更しようとすると、両者は（暗黙的に）ROW EXCLUSIVEロックモードを取得しようとしますが、このロックモードは同時SHAREロックと競合します。

  </para>

  <para>
   <!--
   To continue with the deadlock (when two transaction wait for one another)
   issue raised above, you should follow two general rules to prevent
   deadlock conditions: -->

     上で発生したデッドロック（2つのトランザクションがお互いお互いの終了をに待っている状態）に関する論点を続けると、デッドロック状態を防ぐために2つの一般的なルールに従わなければなりません。

  </para>

  <itemizedlist>
   <listitem>
    <para>
     <!--
     Transactions have to acquire locks on the same objects in the same order.
     -->

     トランザクションは同じオブジェクトに同じ順番でロックを獲得する必要があります。

    </para>

    <para>
     <!--
     For example, if one application updates row R1 and than updates
     row R2 (in the same transaction) then the second application shouldn't
     update row R2 if it's going to update row R1 later (in a single transaction).
     Instead, it should update rows R1 and R2 in the same order as the first
     application. -->

     たとえば、あるアプリケーションが（同じトランザクションの中で）R1行を更新し、そしてR2行を更新する場合、別のアプリケーションは（1つのトランザクションの中で）後でR1行を更新する予定があるならば、R2行を更新してはいけません。その代わりに、最初のアプリケーションと同じ順番でR1行とR2行を更新しなければなりません。

    </para>
   </listitem>

   <listitem>
    <para>
     <!--
     Transactions should acquire two conflicting lock modes only if
     one of them is self-conflicting (i.e., may be held by one
     transaction at time only). If multiple lock modes are involved,
     then transactions should always acquire the  most restrictive mode first.
     -->

     トランザクションは、2つのロックモードの内の1つがそのモード自身と競合する場合（つまり同時に1つのトランザクションしかそのロックを保持できない場合）にのみ、2つのコンフリクトするロックモードを獲得しなければいけません。複数のロックモードが必要な場合は、トランザクションは常に最も制限の強いモードをまず獲得しなければいけません。

    </para>

    <para>
     <!--
     An example for this rule was given previously when discussing the
     use of SHARE ROW EXCLUSIVE mode rather than SHARE mode. -->

     このルールの例は、上の、SHAREモードよりもSHARE ROW EXCLUSIVEモードを使用すべきであるという議論にて記述しています。

    </para>
   </listitem>
  </itemizedlist>

  <note>
   <para>
    <!--
    <productname>Postgres</productname> does detect deadlocks and will
    rollback at least one waiting transaction to resolve the deadlock.
    -->

    <productname>Postgres</productname>はデッドロックを検出し、少なくても1つの待ち状態のトランザクションを、デッドロックを解消するためにロールバックします。

   </para>
  </note>

  <refsect2 id="R2-SQL-LOCK-3">
   <refsect2info>
    <date>1999-06-08</date>
   </refsect2info>
   <title>
    <!-- Notes -->注釈
   </title>

   <para>
    <!--
    <command>LOCK</command> is a <productname>Postgres</productname>
    language extension. -->
    <command>LOCK</command>は<productname>Postgres</productname>の言語拡張です。

   </para>

   <para>
    <!--
    Except for ACCESS SHARE/EXCLUSIVE lock modes, all other
    <productname>Postgres</productname> lock modes and the
    <command>LOCK TABLE</command> syntax are compatible with those
    present in <productname>Oracle</productname>. -->

    ACCESS SHARE/EXCLUSIVEロックモード以外の<productname>Postgres</productname>のロックモードと<command>LOCK TABLE</command>の構文は<productname>Oracle</productname>と互換性があります。

   </para>

   <para>
    <!-- <command>LOCK</command> works only inside transactions. -->
    <command>LOCK</command>はトランザクションの内側でのみ動作します。

   </para>
  </refsect2>
 </refsect1>

 <refsect1 id="R1-SQL-LOCK-2">
  <title>
   <!-- Usage -->使用方法
  </title>

  <para>
   <!--
   Illustrate a SHARE lock on a primary key table when going to perform
   inserts into a foreign key table: -->

   外部キーテーブルへの挿入を行う際のプライマリキーテーブルにSHAREロックするには以下のようにします。
</para>

<programlisting>
BEGIN WORK;
LOCK TABLE films IN SHARE MODE;
SELECT id FROM films
    WHERE name = 'Star Wars: Episode I - The Phantom Menace';
-- Do ROLLBACK if record was not returned
INSERT INTO films_user_comments VALUES
    (_id_, 'GREAT! I was waiting for it for so long!');
COMMIT WORK;
</programlisting>

  <para>
   <!--
   Take a SHARE ROW EXCLUSIVE lock on a primary key table when going
   to perform a delete operation: -->
   削除操作を行う際にプライマリキーテーブルのSHARE ROW EXCLUSIVEロックを取得するには以下のようにします。
</para>

<programlisting>
BEGIN WORK;
LOCK TABLE films IN SHARE ROW EXCLUSIVE MODE;
DELETE FROM films_user_comments WHERE id IN
    (SELECT id FROM films WHERE rating < 5);
DELETE FROM films WHERE rating < 5;
COMMIT WORK;
</programlisting>
 </refsect1>

 <refsect1 id="R1-SQL-LOCK-3">
  <title>
   <!-- Compatibility -->互換性
  </title>
	
  <refsect2 id="R2-SQL-LOCK-4">
   <refsect2info>
    <date>1998-09-24</date>
   </refsect2info>
   <title>
    SQL92
   </title>
   <para>
    <!--
    There is no <command>LOCK TABLE</command> in <acronym>SQL92</acronym>,
    which instead uses <command>SET TRANSACTION</command> to specify
    concurrency levels on transactions.  We support that too; see
    <xref linkend="SQL-SET-TRANSACTION" endterm="SQL-SET-TRANSACTION-TITLE">
    for details. -->

    <acronym>SQL92</acronym>には<command>LOCK TABLE</command>はありません。その代わりにトランザクションの同時性レベルを指定する<command>SET TRANSACTION</command>を使用します。Postgresはこれもサポートしています。詳細については<xref linkend="SQL-SET-TRANSACTION" endterm="SQL-SET-TRANSACTION-TITLE">を参照してください。

   </para>
  </refsect2>
 </refsect1>
</refentry>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:nil
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
sgml-parent-document:nil
sgml-default-dtd-file:"../reference.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:"/usr/lib/sgml/catalog"
sgml-local-ecat-files:nil
End:
-->
