Spring@Transactional
では Controller で指定できる Annotation があるので、Controller メソッド内で起こることはすべて 1 つのトランザクションとして扱われます。しかし、dropwizard では を実装することで、DAO レベルでトランザクションを持つことができますTransactional<DAOclass>
。しかし、1 つのリソース メソッドで 2 つの DAO を使用すると、2 つの異なるトランザクションとして扱われます。
2 つの DAO があるとします。
Dao1.java
public abstract class Dao1 implements Transactional<Dao1>{
@sqlQuery(//somequery)
public abstract void insertIntoArticles();
}
Dao2.java
public abstract class Dao2 implements Transactional<Dao2>{
@sqlQuery(//somequery)
public abstract void insertIntoArticlesChildren();
}
ArticleResource.java
@POST
@PATH("/articles")
public void insertArticleAndItsChildren(Integer articleId){
try{
dao1.begin();
dao2.begin();
dao1.insertIntoArticles();
dao2.insertIntoArticlesChildren();
dao1.commit();
dao2.commit();
}catch(Exception e){
dao1.rollback();
dao2.rollback();
}
}
上記の例では、dao1 と dao2 に 2 つの異なるトランザクションがあります。しかし、単一のトランザクションの下ですべてが必要なので、リソースレベルでトランザクションの境界を指定する方法はありますか?