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