非常经典的现实例子。
其实这也就是为什么要使用AOP的缘故,在目前解决方案中,AOP可以漂亮地解决这个问题。
下面以AspectJ为例子,当然使用其他AOP如Spring或JBoss 3.0更简单,JBoss 3.0相当于使用EJB,缺省支持,无需Spring那样专门配置事务语句。
你的DAO代码写成如下:
ADAO{
methodA(){
Connection con=ConnectionPool.getConnection();
//do methodA thing
methodB2(con);
con.close();
}
methodB(){
Connection con=ConnectionPool.getConnection();
methodB(con);
con.close();
}
methodB(Connection con){//do methodB thing}
}
public aspect Lock {
......
Connection con;
public pointcut writeOperations():
execution(public boolean ADAO.methodA()) ||
execution(public boolean ADAO.methodB()) ) ;
before() : writeOperations() {
//开始事务机制 advice body
con=ConnectionPool.getConnection();
}
after() : writeOperations() {
//结束事务
con.close();
}
......
}
在不使用AOP情况下,你的第三个方案是比较合理的,建议将
methodB(Connection con){//do methodB thing}和mehtodA中主要业务逻辑单独打包成一个类。