2

送信するメールのリストをテーブルから読み取って送信するコードがいくつかあります。

操作の順序は次のとおりです。

  1. テーブルで送信されたフラグを設定します
  2. 自動電話をかける
  3. 専念

自動呼び出しの前に更新を行う理由は、何かが失敗した場合にロールバックして自動呼び出しを行わないようにするためです。しかし、逆の場合は、レコードを更新できずに電話をかけるというシナリオが考えられます (データベースに問題が発生した場合)。

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) {
    }
}

それで、あなたはこれをどのようにしますか?他の解決策はありますか?

4

2 に答える 2

0

これは、従来の複数リソース トランザクション (分散トランザクション) です。XA-transactions と、たとえばTwo Phase Commit protocolについて読むことをお勧めします。

多分あなたは別の問題を解決しようとしていますか?私がそれを正しく理解していれば、コードを変更する必要があるのでしょうか? たとえば、dao から成功を返すことができます。

if(doSomethingOnDb()) 
{
   //make the automatic call
}

つまり、変更が正常に行われてコミットされた場合、dao 呼び出しは true を返します。

この場合、失敗した場合は doSomethingOnDb から例外をスローすることもできます。

try { 
    new MyDao().doSomethingOnDb();
    // operation 3 : make the automatic call
}
catch(Exception e) {
}

スキップoperation 3して catch ブロックに落ちます。

または、実行する関数を dao に渡すだけです。

public void doSomethingOnDb(Runnable precommit) {
    try {
        // operation 1 : execute an update (setting the letter as sent)
        precommit.run();    
        // operation 3 : commit
    }
    catch(Exception e) {
        // Rollback
    }
}   

...
myDao.doSomethingOnDb(new Runnable()
{
   void run()
   {
        // operation 3 : make the automatic call
   }
});
于 2013-09-05T14:25:46.530 に答える
0

DAO 操作を単純にサブメソッドに分離することはできませんか? 何かのようなもの:

public class MyDao {
    public void executeAnUpdate() {...}
    public void commit() {...}
}

public class MyBusiness {
    public void run() {
        myDao.executeAnUpdate();
        // make the automatic call
        myDao.commit();
    }
}
于 2013-09-05T14:34:18.727 に答える