サンプル 7 では、デッドロックを起こしやすい状況と、EJB エンジンがデッドロックを検出し、解除する方法について説明しています。Loan
は、ある固定期間の間だけ存在します。Customer
が期間内に Loan
を支払わない場合は、Customer
がまだ分割で支払いを行っている場合でも Loan
は不履行になります。Loan
が期限までにすべて返済されない場合、Loan
は Loan.ejbRemove
において Customer
の信用格付けを格下げします。しかし、Customer
によって Loan
の支払いが行われると同時に Loan
による信用格付けの格下げが実行されると、デッドロック状況が発生します。
サンプルでは、デッドロックを管理する場所が 2 か所あります。
DeadlockExceptions
は LoanBean.payInstallment
メソッドの throws 節でチェック済みの例外として宣言されます。これによって、EJB エンジンはデッドロック例外を変更しないで処理を行います。これらの宣言を使用しない場合、例外は java.rmi.RemoteExceptions
にラップされます。
DeadlockExceptions
は、CustomerBean.payInstallment
メソッドで調べられ、無視されます。結果として、Customer
の信用格付けを更新するための呼び出しが最終的に実行され、Loan
を不履行にして削除できます。次回 Customer が Loan
を支払うときに、NoSuchObjectException
が検出されます。ここで、Customer
は、Loan
の期限が切れていることを知らされ、支払いが停止されます。