Javaの問題レコード - 更新サイクルにおける二次裁判官と状態
要約:この論文は、環状運転時に発生する可能性の問題を記録します。
問題を再現するために、
ループ構造を使用する場合は、サイクル構造を複数回呼び出すタイミングタスク、またはコードならば、それは何回もリサイクルされますいくつかのオブジェクトにつながる可能性があります。
コードのチェックアウトがある場合たとえば、5分ごとに一度実行されます。
1 @Scheduled(クーロン= "?* * * 0 0/5" ) 2 @Async 。3 公共 ボイドハンドル(){ 4 一覧<顧客> = customerDao.listCustomerByStatusリスト(0); // [ "zhangsan"、「リージ「] 5。 ため(顧客顧客:リスト){ 6 customerDao.updateCustomerStatus(customer.getName(),. 1); // チェックアウトである表し 7つの // チェックアウトコード 。8 customerDao.updateCustomerStatus(customer.getName()、2); / / 決済の完了を示し 9 } 10 }
チェックアウトのコードの実行時間が、あまりにも長い5分以上であると仮定します。
トリガタイミングタスク、0顧客の状態にクエリがZhangSanとリージは、ループのコード・ブロックを入力した最初の時間は、ステータス変更はZhangSan 1になり、トランザクションコードを実行します。
次回は、タスクがトリガーされたときに5分以上のためにチェックアウトコードを実行するので、それほどのタイミングは、ZhangSanはまた、トランザクションコード、状態リシまたは0を実行します。
また、第2トリガタイミングタスク、顧客の問合せ状態は状態1に、リシ0、循環へのコードブロックを有し、リージは、トランザクションコードを実行します。
第2のトリガでは、このときの第1次の顧客リージチェックアウトコードにZhangSanチェックアウトコードサイクルを実行した後にトリガ、スケジュールされたタスク、および定期的なタスクは、顧客につながるリージチェックアウトコードを、実行された場合にはリージは、コードを2回繰り返すチェックアウト。
ソリューション
第一のアプローチは、再びデータサイクルで発見される、状態が1に変更し、各顧客のチェックアウトのためのループを実行します。
第二の選択肢は、状態を再決定することで、ループはトランザクションコードを実行するたびに再チェック何顧客の状況にありますが、このアプローチは、すべてのクエリのデータベースが必要です。
問題の説明
状態変化があるかどうかに注意を払う必要がありますループコードを使用する場合、もしあれば、あなたはリスクの繰り返しプロセスがあるかどうかを検討する必要があります。