最近做了一个系统,分层做的:Model DAO Logic ,再往上就是Struts了。其中有一个功能就是更新Document,Document包括name,detail等字段还包括很多文件,就是说一个文档里包含多个文件!数据库有由Document 和 Files 两个表!
更新Document的逻辑包括三部分内容:实际文件上传到服务器,将相关文件记录写入Files表中,将Document的更新记录写入Document表!
那这样就有问题了,这三个动作肯定就是一个事务,要么全部完成,要么都不做!其中实际文件的上传是写在Logic层中的,而对于两个表的操作是写在DAO中的,那我应该怎么样来实现这样的事务!跨层啊!
再一个就是一般系统中对于事务的处理应该怎样界定?尤其是跨层···
谢了

解决方案 »

  1.   

    问一下 model 和 logic 分别是做什么的?
      

  2.   

    lz先不按你的分层啊,跟LS一样没看明白就拿经典分层 DAO service view 来说吧事务是放在业务层的,并不是说不能把事务放到DAO,但DAO一般写的都是最基本的增删改查方法,出来的数据自然是最原始的,而这部分数据一般又不不会被表示层使用提交给用户。而且如果放在DAO层会导致大量使用缓存来存储这些数据,这就是为什么要放到业务层,当逻辑真正需要的时候才去查数据,才提交事务。这也是为什么现在大多数ORM框架要使用lazy的原因的。最终目的就是用的时候才去查
      

  3.   

    这是 J2EE 设计模式中的事务上下文模式,要实现这个模式的话,如果要自己实现的话,得掌握 ThreadLocal、动态代理等技术。
    要考虑的东西有很多,比如说事务的传播性等等,而且 DAO 中的 Connection 获取方式得重写改写,得从 ThreadLocal 中获得
    当前请求线程中的 Connection 对象,并且在 DAO 中这个 Connection 还不能关。而且还必须确定事务的边界位于哪一层,如果
    确定在哪一层的话,就采用动态代理,将这一层中的方法进行代理增强,在代理方法中开启事务,提交事务。呵呵,自己实现的话还是比较复杂的,只能建你使用开源框架来管理事务了,比如 Spring。
      

  4.   

    对于多层间应用事务,互相调用就好了,而且建议使用接口调用,因为不管经典的Spring还是用到过滤器,都要用动态代理的,用代理就要有接口
      

  5.   

    model 是数据库表的映射,里面都是数据库的字段以及get set 方法!Logic就是一些逻辑的分析处理相当于是service层吧!
    按照层次的概念来的话,我肯定是先完成上传文件,然后在做数据库操作。那要是上传文件结束了,写数据库的时候出问题了,那上传的文件岂不是成了垃圾文件,那该怎么办?
      

  6.   


    那只能在 catch 块中把那个文件删掉
      

  7.   


    cglib虽然不不用类使用接口,但原理还是一样的,他是继承了被代理类然后生成一个所谓cglib代理,可以说也是模拟一种接口实现