問題タブ [pessimistic-locking]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mysql - ConstraintViolationException をキャッチし、一意の制約を処理する
私は本当に休止状態に腹を立てています!
カテゴリのツリーを構築できる親子関係を保持するデータベース テーブル (mysql) があります。取得しようとする複数のスレッドがあり、そこにない場合はカテゴリ パスを作成します (いくつかの親子行が暗示されます) ほぼ同時に。
問題は、私が TRANSACTION_READ_COMMITTED のみを使用していることです。そのため、スレッドが見つからなかったためにカテゴリ サブパスの親子を作成できる競合状態が発生し、(lo!) 別のスレッドがこれを同時。この問題を解決するために、親/子 ID に一意の制約を設定し、完全なカテゴリ パスに一意の制約を設定しました。次に、自分のセッションで休止状態の ConstraintViolationException をキャッチすることを望み、別のスレッドが新しい関係を書き込んだことを知って、他のスレッドが catch 句に書き込んだ行をクエリします。そして、セッションで必要なすべてのことを実行して、そのスレッドを続行してみてください。
これは、複数のスレッドが同じ長いカテゴリ パス (いくつかのサブ親子関係行を含む) を同時に取得/作成する作業を行い、一意の制約が確実に行われるという問題を解決するために考えられる唯一の方法です支持した。
しかし、休止状態は ConstraintViolationException でセッションを無効にし、最終的にアサーション例外 (「com.stagirite.bean.Category エントリの ID が null (例外が発生した後にセッションをフラッシュしないでください)」) をスローするため、私の解決策は実行できません。
悲観的ロックを使用せずに、重複する行を作成しない「取得/作成」モデルのアプリケーション全体でこれをどのように解決しますか?
アンディ
database - executeUpdate() を使用した Grails 悲観的ロック
grails で executeUpdate() コマンドを使用して悲観的ロックを使用する方法に関する情報が見つかりません。これは可能ですか?
[更新] Burt の提案によると、これが結果のクエリです。このオプションがないため、PESSIMISTIC_WRITE の代わりに非推奨の UPGRADE を使用したことに注意してください。
ありがとう、
エイブラハム。
hibernate - 多くのユーザー要求に対する悲観的ロック
多くのユーザー リクエストに対して持続するペシミスティック ロックを作成することは可能ですか?
Java EE で Hibernate を使用するか、PHP で Doctrine または Propel を使用してそれが可能かどうかを知りたいです。Doctrine 2 を使用してこれを試しましたが、データベース レベルでのみ (ユーザーの要求ごとに) 不可能です。
ruby-on-rails-3 - Railsの悲観的ロックが機能しない
アプリで悲観的ロックを使用しようとしていますが、機能しません... Activerecord-oracle_enhanced-adapter (1.3.2) を使用して Rails 3 (3.0.9) を使用していますが、ロック オプションが機能するようになりました。私のため... :(
アプリは、実行されたSQLでse「for update」句を使用しないでください...
そこで、生成されたクエリを示すためにこのスクリプトを作成しました... (そして、development.log も確認しました)...
結果:
私が欠けているものを知っている人はいますか?
ありがとう!
java - 春の悲観的ロック
私は休止状態のクエリを使用して、Java の下で春のプロジェクトを持っています。悲観的ロックを使用するのが好きです。
Spring + Hibernateで悲観的ロックを行う方法は?
編集:
問題:
メソッドで悲観的ロックを使用したいのですが、このメソッドを別のメソッドから呼び出します。悲観的は、最初のメソッドから呼び出すと正常に動作しますが、2 番目のメソッドから呼び出すと (トランザクションをコミットできませんでした) が返されます
例外:
ruby-on-rails-3 - Rails 3のレコードを特定の時間ロックするにはどうすればよいですか?
私がやりたいのは、基本的に、ユーザーがレコードのロックを取得し、ウィキペディアのようにレコードに変更を加えることができるように、特定の時間ロックを取得することです。つまり、ウィキペディアの記事では、他のユーザーが編集する前に、ユーザーが編集するのに1時間かかるとします。
Rails 3でそれをどのように達成できますか?読んだところ、悲観的なロックがロックに使用する必要があることがわかりました。それを考えると...1時間後にロックを解除するためにどのようなメカニズムを使用しますか?
私のスタックはRails3、Heroku、PostgreSQLです。
回答ありがとうございます。できればコードを見るのが大好きです。
hibernate - エンティティの削除時に StaleObjectStateException を回避する
同時に(Spring)トランザクションサービスに入る2つの同時スレッドがあります。
Hibernate を使用して、サービス メソッドはいくつかのエンティティをロードして処理し、エンティティを見つけて DB から削除します。擬似コードは次のとおりです。
2 つのスレッドが同時に同じパラメーターを渡す場合、両方が同じエンティティを「検索」し、両方が を呼び出しますdelete
。org.hibernate.StaleObjectStateException
そのうちの 1 つは、セッションが閉じているときに をスローして失敗します。
例外がスローされずに、両方のスレッドがエンティティを返すことを望みます。これを達成するために、次のように、エンティティを削除する前に(「select ... for update」で)ロックしようとしました:
load()
代わりに使用するのget()
は、hibernate API によると、既にセッションにある場合は get がエンティティを返し、load はエンティティを再読み取りする必要があるためです。
2 つのスレッドが同時に上記の方法に入ると、そのうちの 1 つがロック ステージをブロックし、最初のスレッドがトランザクションを閉じると、2 番目のスレッドが呼び出されてorg.hibernate.StaleObjectStateException
. なんで?
ロックされたロードが null を返さないのはなぜですか? どうすればこれを達成できますか?
persistence - EJB3 永続性 NamedQuery の LockMode
EJB3 Persistence NamedQuery で LockMode を指定するにはどうすればよいですか? Pessimistic LockMode を既存の select に追加して、必要に応じて更新できるようにしたいのですが、驚くべきことに Query オブジェクトには setLockMode(xxx) メソッドがありません (私の理解では、EJB3 永続性のサブセットである JPA が setLockMode を公開し、EJB3 永続性がメソッドを使用可能にする必要があります)。それも)。
クエリを手動で「更新用に選択」に変更する必要はないと思います。
ありがとうケビン
php - php/mysql Webアプリケーションで悲観的ロックを実装する方法は?
php/mysql Webアプリケーションで悲観的ロックを実装する方法は?
- web-user がページを開いて 1 つのデータセット (行) を編集します
- Web ユーザーが「ロック」ボタンをクリックすると、他のユーザーはこのデータセットを読み取ることはできますが、書き込むことはできなくなります
- web-user がいくつかの変更を行います (おそらく 1 ~ 30 分かかります)
- Web ユーザーが「保存」または「キャンセル」をクリックすると、「ロック」が解除されます
このシナリオの php/mysql に標準的な方法はありますか? Web ユーザーが「保存」/「キャンセル」をクリックせずに Internet Explorer を閉じた場合はどうなりますか?
java - 行が別のトランザクションによって更新または削除された (または、保存されていない値のマッピングが正しくない)
Web サーバー上で実行される Java プロジェクトがあります。私はいつもこの例外に遭遇します。
いくつかのドキュメントを読んだところ、悲観的ロック (または楽観的ですが、悲観的の方が優れていると読みました) がこの例外を防ぐ最善の方法であることがわかりました。
しかし、その使用方法を説明する明確な例は見つかりませんでした。
私の方法は次のようなものです:
その間:
Email
Hibernate クラスです (データベース内のテーブルになります)getEmailById(String id)
を返す関数ですemail
(このメソッドには の注釈が付けられていません@Transactional
) 。updateEmail(email)
: メールを更新するメソッドです。
注:保存、更新などにHibernateを使用しています(例session.getcurrentSession.save(email)
:)
例外: