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 関数で取得したロックを明示的に解放するために使用します。 |