オンラインスケジュールアプリを開発中です。1 つのスケジュールを複数のユーザーが同時に編集できます。非常に重要なビジネス上の制約が 1 つあります。1 日に 3 つのイベントのみが発生する必要があります。
技術的に言えば単純化すると、データベースには次の列を持つテーブルがあります。ID | イベント | 日付 |。アプリケーションはトランザクション「select... count... where...」で実行され、結果が 3 未満の場合、新しいイベントが挿入されます。
2 つのスレッドが 1 日に 4 つのイベントを作成しないことを保証するには、どのアプローチを使用できますか? これは、古典的なチェック アンド ライトの問題です。そして、データベースレベルでどのように解決できるのだろうか?
トランザクションを使用しても、2 番目のトランザクションで別のスレッドが同じことをしないとは限りません。イベントの数が 3 未満であることを確認し、挿入を行います。テーブル全体をロックすることは、応答時間や同時実行性などが低下するため、受け入れられません。
アプリケーションは、Spring、Hibernate、MySQL を使用して Java で開発されています。
アドバイスをよろしくお願いします。