読み取り操作と書き込み操作の間でテーブルをロックする方法

user2054927

新しい各レコードに一意で読み取り可能な値が含まれている必要がある状況があります。この値はユーザーにとってビジネス上の意味があり、データベースでは(主キーの横にある)自然IDとして処理されます。

値の構造を理解するには、次のようにします。

 - record 1 has business value 'INVOICE_AAA_001'
 - record 2 has business value 'INVOICE_AAA_002'
   ...
 - record 999  has business value 'INVOICE_AAA_999'
 - record 1000 has business value 'INVOICE_BAA_001'
 - record 1001 has business value 'INVOICE_BAA_002'
   ...

このビジネス価値は、工場によって生み出されます。

class BusinessFactory {

    ...    

    public String createUniqueValue() {
        String lastValue = (String) getSession().createQuery("select businessValue " + 
                                                             "from Invoice as invoice " + 
                                                             "order by businessValue")
                                                .setMaxResults(1)
                                                .setReadOnly(true)
                                                .uniqueResult();    

       // generate new value 

       return newValue;
    }

}

サービスレイヤーはファクトリを呼び出し、新しい請求書を保存します。

  @Transactional
  public void saveNewInvoice() {
      final String newValue = businessFactory.createUniqueValue();        
      Invoice invoice = new Invoice(newValue);
      invoiceRepository.save(invoice);
  }

ここでの問題は、trx1とtrx2がビジネス値「INVOICE_BAA_002」を読み取る状況が存在する可能性があることです。次に起こることは、2つのtrxが同じ値で動作しているということです。最初にコミットするtrxは成功し、2番目は一意の制約例外のために失敗します。

したがって、最新のビジネス値を読み取るときに、請求書テーブルをロックする必要があります。このロックは、新しい請求書エンティティがDBに保存されるまでアクティブである必要があると思います。

Hibernateでこれをどのように行う必要がありますか?

ウラドミハルセア

一意の制約や楽観的ロック依存するなど、競合検出の同時実行制御メカニズムを使用する代わりに、悲観的ロックを使用できます。

あなたが持っている必要があります:

  1. InvoiceSequenceエンティティがマップされテーブル
  2. このテーブルには1行しかなく、最新の請求書シーケンス値が格納されています
  3. レコードの排他ロック取得します

    InvoiceSequence invoiceSequence = em.find(InvoiceSequence.class, 1L, LockModeType.PESSIMISTIC_WRITE)
    
  4. ビジネスロジックを使用してシーケンスをインクリメントし、エンティティを変更して最新の値を格納します。

    String currentSequence = invoiceSequence.getValue();
    String nextSequence = sequenceGenerator.nextValue(currentSequence);
    invoiceSequence.setValue(nextSequence);
    

排他ロックは、同時読み取りと書き込みの両方を防ぎます。私のHigh-PerformanceJava Persistenceの本には、トランザクションに関する非常に徹底的な章があり、それも役立つかもしれません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Androidの同じアクティビティでNFCの読み取りおよび書き込み操作を使用することは可能ですか?

分類Dev

複数のユーザーが同時にテーブルの書き込みと読み取りを行うことでテーブルがロックされないようにするにはどうすればよいですか?

分類Dev

ソケットからの読み取り時に書き込み操作でスタックする

分類Dev

Firestoreクエリ/ where操作で読み取り/書き込みを計算する方法は?

分類Dev

クラウドFirestoreで読み取り/書き込み操作を最適化する方法は?

分類Dev

読み取り(書き込み)容量ユニットは、読み取り(書き込み)操作の最小実行時間を定義しますか

分類Dev

テーブルの読み取りと書き込みをユーザーに許可する

分類Dev

内部でのPythonの読み取り/書き込み/シーク操作

分類Dev

読み取りが発生したときのObjectiveCロック書き込み操作

分類Dev

ファイルとの間でオブジェクトの書き込みと読み取りを行う

分類Dev

CPUは、IOの読み取り/書き込みがブロックされているJavaスレッドで時間を浪費しますか?

分類Dev

プロセス間で読み取り/書き込みロックを共有する

分類Dev

cでの読み取りと書き込みを理解する

分類Dev

このFTPブロック読み取り操作がEOFErrorをスローするのはなぜですか?

分類Dev

JSON(Jquery)を使用して、ロールと権限(読み取り、書き込み、削除、書き込み特殊)のテーブルマトリックスを作成します

分類Dev

読み取り/書き込みロックの実装を最適化する

分類Dev

<<と>>をオーバーロードして、クラスのファイルの書き込みと読み取りに使用する方法

分類Dev

Parcelableでのパーセルの読み取り/書き込み操作中に、可変順序は重要ですか?

分類Dev

SQLServerの同じテーブルの異なる行での同時読み取りと書き込み

分類Dev

ヘッダーファイル(.h)で不変の読み取り専用プロパティ、実装(.m)で変更可能な読み取り/書き込みプロパティを作成する方法

分類Dev

OPC UAの読み取りおよび書き込み操作はアトミックですか?

分類Dev

JUnitを使用して読み取り/書き込みロックをテストする方法は?

分類Dev

カーネルブロックはどのようにsys呼び出しの読み取りと書き込みを行いますか?

分類Dev

Firestore-読み取りおよび書き込み操作の数を追跡する方法

分類Dev

読み取りと書き込みの両方でブーストIOstreamメモリマップを開く方法

分類Dev

pthreadの読み取り/書き込みロックでライターの不足を防ぐ方法

分類Dev

PyQt5QProcessとの間で読み取り/書き込みを行う方法

分類Dev

グローバルではなくリクエストごとにSquid接続|読み取り|書き込みタイムアウトを設定する方法

分類Dev

CPythonC拡張タイプで属性の読み取り/書き込みの前にロックを取得する

Related 関連記事

  1. 1

    Androidの同じアクティビティでNFCの読み取りおよび書き込み操作を使用することは可能ですか?

  2. 2

    複数のユーザーが同時にテーブルの書き込みと読み取りを行うことでテーブルがロックされないようにするにはどうすればよいですか?

  3. 3

    ソケットからの読み取り時に書き込み操作でスタックする

  4. 4

    Firestoreクエリ/ where操作で読み取り/書き込みを計算する方法は?

  5. 5

    クラウドFirestoreで読み取り/書き込み操作を最適化する方法は?

  6. 6

    読み取り(書き込み)容量ユニットは、読み取り(書き込み)操作の最小実行時間を定義しますか

  7. 7

    テーブルの読み取りと書き込みをユーザーに許可する

  8. 8

    内部でのPythonの読み取り/書き込み/シーク操作

  9. 9

    読み取りが発生したときのObjectiveCロック書き込み操作

  10. 10

    ファイルとの間でオブジェクトの書き込みと読み取りを行う

  11. 11

    CPUは、IOの読み取り/書き込みがブロックされているJavaスレッドで時間を浪費しますか?

  12. 12

    プロセス間で読み取り/書き込みロックを共有する

  13. 13

    cでの読み取りと書き込みを理解する

  14. 14

    このFTPブロック読み取り操作がEOFErrorをスローするのはなぜですか?

  15. 15

    JSON(Jquery)を使用して、ロールと権限(読み取り、書き込み、削除、書き込み特殊)のテーブルマトリックスを作成します

  16. 16

    読み取り/書き込みロックの実装を最適化する

  17. 17

    <<と>>をオーバーロードして、クラスのファイルの書き込みと読み取りに使用する方法

  18. 18

    Parcelableでのパーセルの読み取り/書き込み操作中に、可変順序は重要ですか?

  19. 19

    SQLServerの同じテーブルの異なる行での同時読み取りと書き込み

  20. 20

    ヘッダーファイル(.h)で不変の読み取り専用プロパティ、実装(.m)で変更可能な読み取り/書き込みプロパティを作成する方法

  21. 21

    OPC UAの読み取りおよび書き込み操作はアトミックですか?

  22. 22

    JUnitを使用して読み取り/書き込みロックをテストする方法は?

  23. 23

    カーネルブロックはどのようにsys呼び出しの読み取りと書き込みを行いますか?

  24. 24

    Firestore-読み取りおよび書き込み操作の数を追跡する方法

  25. 25

    読み取りと書き込みの両方でブーストIOstreamメモリマップを開く方法

  26. 26

    pthreadの読み取り/書き込みロックでライターの不足を防ぐ方法

  27. 27

    PyQt5QProcessとの間で読み取り/書き込みを行う方法

  28. 28

    グローバルではなくリクエストごとにSquid接続|読み取り|書き込みタイムアウトを設定する方法

  29. 29

    CPythonC拡張タイプで属性の読み取り/書き込みの前にロックを取得する

ホットタグ

アーカイブ