送信するメールのリストをテーブルから読み取って送信するコードがいくつかあります。
操作の順序は次のとおりです。
- テーブルで送信されたフラグを設定します
- 自動電話をかける
- 専念
自動呼び出しの前に更新を行う理由は、何かが失敗した場合にロールバックして自動呼び出しを行わないようにするためです。しかし、逆の場合は、レコードを更新できずに電話をかけるというシナリオが考えられます (データベースに問題が発生した場合)。
public class MyDao {
public void doSomethingOnDb() {
try {
// operation 1 : execute an update (setting the letter as sent)
// operation 2 : make automatic call
// operation 3 : commit
}
catch(Exception e) {
// Rollback
}
}
}
ここで気に入らないのは、dao 内に自動呼び出しを行う機能を配置していることですが、これは dao が期待することではありません。しかし、ロジックを分離すると、テーブルのフラグが真実であるとは確信できません。呼び出しを行うことができ、フラグをデータベースに更新できません。
public class MyDao {
public void doSomethingOnDb() {
try {
// operation 1 : execute an update (setting the letter as sent)
// operation 2 : commit
}
catch(Exception e) {
// Rollback
}
}
}
public void someOtherMethodSomewhere() {
try {
new MyDao().doSomethingOnDb();
// operation 3 : make the automatic call
}
catch(Exception e) {
}
}
それで、あなたはこれをどのようにしますか?他の解決策はありますか?