1

背景: 複数のインスタンスが同じ Account Table から読み取る MYSql データベースに取り組んでいます。ダーティ リードを回避するために、Hibernate クエリ言語を使用して行レベルの排他ロックを実装したいと考えています。

私のコードは以下の通りです。

List<AccountTableBean> currentRequestslist = sessionFactory.getCurrentSession()
                .createQuery("from Account where status = :finalStatus")
                .setLockMode("MappCurrentRequests", LockMode.PESSIMISTIC_READ)
                .setParameter("finalStatus","Active").list();   

現在、テーブル全体で Pessimistic_read を使用しています。個々の行をロックする方法はありますか? どの例も非常に役立ちます。

ありがとう、ゲンダフル

4

1 に答える 1

2

ロックの種類は、データベース自体によって暗示されます。

MyISAM ストレージ エンジンを使用している場合、行レベルのロックを強制するためにできることはありません。生の SQL であれ、JDBC であれ、どれだけ努力してもできません。MyISAM は行レベルのロックをサポートしていません。

setLockModeInnoDB の使用に切り替えるだけで、必要なロック タイプを取得するために呼び出す必要さえありません。

マニュアルから:

MySQL は InnoDB テーブルに行レベルのロックを使用して、複数のセッションによる同時書き込みアクセスをサポートし、マルチユーザー、高度な同時実行、および OLTP アプリケーションに適したものにします。MySQL は MyISAM、MEMORY、および MERGE テーブルにテーブル レベルのロックを使用し、一度に 1 つのセッションのみがこれらのテーブルを更新できるようにするため、読み取り専用、ほとんど読み取り、またはシングル ユーザー アプリケーションにより適しています。

于 2012-10-29T22:55:01.730 に答える