今天面试被问Spring的声明式事务为何要加在业务层,还问加在业务层是怎么实现控制事务的我一听就晕了以前都是在hibernate中用session实现事务控制,话说这加在业务层的控制怎么作用到session上的??
难道声明式事务控制在底层依然是加在了dao层? spring是怎么知道dao层用的什么框架?

解决方案 »

  1.   

    其实就是AOP,说穿了就是通过动态代理来实现的,spring为你生成的对象都是代理对象。他不用关心你用什么框架还是JDBC之类的,他只需要你告诉他什么方法需要事务,那么他会这个方法原子操作了。具体的建议去了解一下反射和动态代理。了解过后你就清楚了
      

  2.   

    业务层被看做是一个完整的可能是多个dao操作的原子流程,其中一个dao操作失败,则全部回滚。
    spring aop对事务支持比较出色,有声明式事务和注解配置事务,都比较简单。具体配置网上很多。
      

  3.   

    因为dao知识负责单步数据库操作,Action只是负责与 client交互数据。 真正的业务处理是在service层,一个service方法就是我们的一个业务原子操作。 控制用spring aop  拦截我们感兴趣的方法
      

  4.   


    这事务的aop代码加在哪层了我还没搞清楚。
      

  5.   

    比如你有个注册的功能 。 注册的时候你有如下操作:我这机器上打中文带慢了1,save username and password as a new record.
    2, save user's detail info.
    3, other business..
    each of the three step May use itself DAO.the method is service may like this:public void registerUser(User user,UserDetail detail){
        userDao.save(user);
        userDetail.saveDetail(detail);
         .....
          ....
    }the register method will be success when userDao.save(user);
        userDetail.saveDetail(detail);is run well without Exception . if there's any Exception the register method must be failure. so the transaction must invoke in register .because the register() method is a atomic method in the business.
      

  6.   


    a transaction must have many operation like hand database,modify resource and so on .a transaction can guarantee the operation all success or failure.
      

  7.   

    又想到一个问题,dao层我们都用spring的HibernateDAOSupport类,这里面的模板方法不就已经有事务了么?这和声明式的事务不重复么?
      

  8.   


    dao也可以多步数据库操作吧。
      

  9.   


    我琢磨了一下,spring是要知道dao具体框架的,现在的问题是,HibernateDAOSupport对声明式事务是做了支持了么?必须要用么?继续等待大牛漏漏
      

  10.   

    首先给你讲Spring的声明式事务为何要加在业务层,
    如果你对这方面的研究不熟悉的话。
    你就说spring的核心就是aop,它就是为了把日志,
    安全,性能和业务逻辑区别开。所以它要把Spring的声明式事务要加在业务层还问加在业务层是怎么实现控制事务的
    它是通过拦截器把你的方法拦截,用代理工厂产生一个对象。就这么简单
      

  11.   

    呃。。
    貌似业务层指的是service层吧。
    不明白你们凭什么觉得事务是封装在dao层了
      

  12.   

    AOP 配置的时候运用通配符  全部在你的service逻辑方法前切入事物控制,dao写到service里面是因为一个业务可能同时调用多个dao  而这多个dao构成同一个逻辑---事务的完成性,至于它是怎么实现的,去看源代码,其实事务的AOP 可以自己去写的