DBMS_LOCK システムパッケージは、OceanBaseデータベースのロック管理サービスのインターフェースを提供します。
DBMS_LOCK システムパッケージは、主に以下の機能を提供します:
ミューテキシング機能の提供:特定のデバイス(例えば、端末)への排他的アクセスを提供します。
ロック解放の検知:アプリケーションがロックを解放またはクリーンアップした後、他者がそれを検知できるようにします。
同期機能:異なるアプリケーションやプロセス間の調整と同期を行います。
適用対象
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity EditionはMySQLモードのみを提供します。
DBMS_LOCK権限の説明
データベースシステムでは、利用可能なロックの最大総数に制限があります。ロックの使用時やこのパッケージを他のユーザーに提供する際は、特定のユーザーまたはロールに EXECUTE 権限のみを付与することを検討してください。
DBMS_LOCK定数
DBMS_LOCK でパラメータ値を指定する際に使用する定数は、次の表のとおりです。
名前 |
プロパティ名 |
型 |
値 |
OEM略称 |
説明 |
|---|---|---|---|---|---|
| NL_MODE | Nul1 | INTEGER | 1 | なし | ロックフリーモード |
| SS_MODE | Sub Shared | INTEGER | 2 | ULRS | 意図読み取りロック |
| SX_MODE | Sub eXclusive/Row Exclusive Mode | INTEGER | 3 | ULRX | 意図書き込みロック |
| S_MODE | Shared/Row Exclusive Mode/Intended Exclusive | INTEGER | 4 | ULRSX | 読み取りロック |
| SSX_MODE | Shared Sub eXclusive/Share Row Exclusive Mode | INTEGER | 5 | なし | 共有意図書き込みロック |
| X_MODE | Exclusive | INTEGER | 6 | ULX | 書き込みロック |
DBMS_LOCKのルールと制限
次の表はロックの互換性マトリックスです。Y は申請成功、N は申請失敗を示します。
ロックタイプ |
NLロック申請 |
SSロック申請 |
SXロック申請 |
Sロック申請 |
SSXロック申請 |
Xロック申請 |
|---|---|---|---|---|---|---|
| NL | Y | Y | Y | Y | Y | Y |
| SS | Y | Y | Y | Y | Y | N |
| SX | Y | Y | Y | N | N | N |
| S | Y | Y | N | Y | N | N |
| SSX | Y | Y | N | N | N | N |
| X | Y | N | N | N | N | N |
ロックを申請する際に、デフォルトの待機時間 maxwait を設定します。
maxwait constant integer := 32767;
DBMS_LOCK の使用上の注意点
- ユーザーロックは「UL」プレフィックスが付き、テーブルロックと競合しません。
- セッションが切断されると、ロックは解放されます。
- ロックIDの取り得る範囲は(0, 1073741823)です。
- ユーザーロックはテーブルロックと同じ動作をし、テーブルロックのすべての機能(デッドロック検出など)を備えています。
- 分散トランザクションで使用するユーザーロックは、トランザクションコミット時に必ず解放してください。そうでない場合、デッドロックの問題が発生する可能性があります。
- 各セッションにおいて、
DBMS_LOCKのベストプラクティスは、ロックの数を数百個以内に制限することです。
DBMS_LOCKサブプログラムの概要
次の表は、OceanBaseデータベースの現在のバージョンでサポートされている DBMS_LOCK サブプログラムとその簡単な説明を示しています。
サブプログラム |
説明 |
|---|---|
| ALLOCATE_UNIQUE | ロック名に対して一意のロックIDを申請します。ロックIDの取り得る範囲は(1073741824, 1999999999)です。 |
| ALLOCATE_UNIQUE_AUTONOMOUS | ロック名に対して一意のロックIDを申請します。 |
| REQUEST | ロックを申請します。 |
| SLEEP | 指定された時間だけ現在のセッションをブロックします。 |
| RELEASE | 以前に REQUEST 関数で取得したロックを明示的に解放するために使用します。 |