高度な機能 - データベースのロック操作
データベースは複数のユーザーが同時にデータにアクセスする共有リソースです。同時実行を制御しないと、複数のトランザクションが同時にデータにアクセスすることになり、誤った読み取りが発生する可能性があります。したがって、ロックはデータベースの同時実行制御を実現するための非常に重要なテクノロジーです。
まず、IDBLocker によって提供されるロックの種類を理解します。 MySQL:データベースのロックのプロセスは次のとおりです。 トランザクションが特定のデータを処理しているとき。ロックされたトランザクションは、ロックを解放する前に、データ オブジェクトに対する特定の制御を持ちます。そのため、JDBC モジュールは制御機能を統合します。データベース クエリ操作におけるデータベース レコード ロック用の IDBLocker は、パラメータの形式でも同様に簡単に使用できます。
IDBLocker.MYSQL: 行レベルのロック、修飾されたデータのみがロックされ、他のプロセスはリソースがロック解除されるのを待ってから動作します。
Oracle:
IDBLocker.ORACLE: 行レベルのロック、修飾されたデータのみがロックされ、他のプロセスはリソースのロックが解除されるのを待ってから動作します。 , 結果セット内の一部のデータがロックされていることが判明した場合は、すぐに「ORA-00054 エラー」が返されます SQL Server:
IDBLocker.SQLSERVER_NOLOCK: ロックなし、読み取り時にロックなし。またはデータを変更する; IDBLocker.SQLSERVER_HOLDLOCK: ロックを保持し、途中で解放せずにトランザクション全体が終了するまで保持します。同時に、このプロセスのみがデータを変更できます。 IDBLocker.SQLSERVER_TABLOCK: テーブル ロック。コマンドが終了するまでテーブル全体が共有ロックを設定し、他のプロセスはデータの読み取りのみが可能ですが、
IDBLocker は変更できません。 .SQLSERVER_PAGLOCK: ページ ロック; IDBLocker.SQLSERVER_TABLOCKX: row これはテーブル ロックであり、他のプロセスがテーブル内のデータを読み取りまたは変更できないようにします。 :
は、IDBLocker インターフェイスを通じて自分で実装できます。
サンプル コードを使用してロックの使用方法を示します。 サンプル コード 1: EntitySQL オブジェクトを介してロック パラメーターを渡します。コード 2: 選択クエリ オブジェクトを通じてロック パラメーターを渡します。session.find(EntitySQL.create(User.class) .field(Fields.create(User.FIELDS.ID, User.FIELDS.USER_NAME).excluded(true)) .forUpdate(IDBLocker.MYSQL));
サンプル コード 3: データ エンティティ オブジェクトに基づいてロック パラメーターを渡します
Select _select = Select.create(User.class, "u") .field("u", "username").field("ue", "money") .where(Where.create( Cond.create().eq(User.FIELDS.ID).param("bc19f5645aa9438089c5e9954e5f1ac5"))) .forUpdate(IDBLocker.MYSQL); session.find(SQL.create(_select), IResultSetHandler.ARRAY);
注:
データベース ロック メカニズムを使用してください。デッドロックを避けるためにテーブルをロックしないように注意してください。