マルチユーザー環境では、Hibernate はデータの整合性を確保するためにオプティミスティック ロックとペシミスティック ロックを提供します。オプティミスティック ロックは、トランザクションがデータを変更するときに他のトランザクションが競合しないことを前提としています。バージョン フィールドのチェックを通じて実装され、高いパフォーマンスとスケーラビリティを備えていますが、データ損失が発生する可能性があります。悲観的ロックはトランザクション間の競合を想定しており、データベース ロックを通じて実装されます。これにより、同時変更を防ぐことができますが、パフォーマンスとスケーラビリティが低下します。具体的な選択は、同時変更の頻度とデータ整合性の重要性によって異なります。
Hibernate のオプティミスティック ロックとペシミスティック ロック
マルチユーザー環境では、データの整合性が非常に重要です。 Hibernate は、同時アクセスの整合性を確保するために、オプティミスティック ロックとペシミスティック ロックという 2 つのロック メカニズムを提供します。
オプティミスティック ロック
オプティミスティック ロックは、トランザクションがデータを変更するときに、他のトランザクションが同時に競合する変更を行わないという前提に基づいています。この仮定が当てはまる場合、トランザクションはロック競合を引き起こすことなく迅速にコミットできます。
実装方法: Hibernate は、バージョン フィールドを使用して楽観的ロックを実装します。エンティティが変更されるたびに、バージョン フィールドが増分されます。トランザクションがコミットしようとすると、Hibernate は現在のバージョン フィールドがデータベースのバージョン フィールドと一致するかどうかを確認します。バージョン フィールドが一致しない場合、トランザクションはロールバックされ、StaleObjectStateException
例外がスローされます。
利点:
欠点:
悲観的ロック
悲観的ロックは、トランザクションがデータを変更するときに、他のトランザクションが同じデータに対して競合する変更を同時に行う可能性があるという前提に基づいています。時間。 。したがって、悲観的ロックでは、同時アクセスを防ぐために即座にロックが取得されます。
実装方法: Hibernate は主にデータベース レベルのロックを使用して悲観的ロックを実装します。トランザクションが開始されると、他のトランザクションによるデータの同時変更を防ぐために、読み取りまたは書き込みのロックが取得されます。
利点:
欠点:
実際的なケース:
複数のユーザーが同じ商品詳細ページを同時に閲覧する電子商取引 Web サイトを考えてみましょう。同時購入による在庫エラーの発生を防ぐために、オプティミスティック ロックを使用できます。
@Entity public class Product { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private int quantity; @Version private long version; }
ユーザーがアイテムを購入しようとすると、Hibernate は version
フィールドをインクリメントします。この時点で別のユーザーも購入しようとすると、最初のユーザーがトランザクションをコミットしたときに、Hibernate は version
フィールドの不一致を検出し、最初のユーザーの購入をロールバックします。
その他の考慮事項:
以上がHibernate はオプティミスティック ロックとペシミスティック ロックをどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。