テーブル全体 (単一の行ではなく) をドクトリンでロックする必要があります。可能であれば、ネイティブ クエリを使用せずにこれを実行したいと考えています。
ペシミスティック ロックのドキュメントでは、次の方法で特定のエンティティをロックする方法についてのみ説明しています。
- EntityManager#find
- EntityManager#ロック
- クエリ#setLockMode
テーブル内の残りの行の値に依存する値を持つ行を挿入する必要があるトランザクションがあるため、そのテーブルで 2 つのトランザクションが同時に実行されるのを防ぐ必要があります。
私は、明示的なトランザクション境界を使用しています。これは、ロックでうまく機能するはずです (上記のドキュメントによると)。
注: この場合、楽観的ロックは十分ではありません。トランザクションを再試行する余裕はありません。さらに、クエリが遅くなることは想定されていないため、パフォーマンスは問題になりません。
編集:例を挙げます。auto_increment を手作業で作成したいと想像してください。次の結果を挿入するには、前の結果を取得するためにテーブルから max() を選択する必要があります。max() を同時に選択した場合に備えて、2 つのトランザクションが同じ値を挿入しようとしないようにする必要があります。
たとえば、文字列、複数の列、ハッシュ、または前の行セットで行う必要がある計算など、 auto_increment が適切でない場合、この問題の一般的な解決策を探しています。
ロックは確実な解決策であり、楽観的ロックとは異なり、エラーが発生した場合に再試行する必要はありません。
では、ドクトリンでテーブルロックを使用する方法はありますか?