最近做了一个系统,分层做的:Model DAO Logic ,再往上就是Struts了。其中有一个功能就是更新Document,Document包括name,detail等字段还包括很多文件,就是说一个文档里包含多个文件!数据库有由Document 和 Files 两个表!
更新Document的逻辑包括三部分内容:实际文件上传到服务器,将相关文件记录写入Files表中,将Document的更新记录写入Document表!
那这样就有问题了,这三个动作肯定就是一个事务,要么全部完成,要么都不做!其中实际文件的上传是写在Logic层中的,而对于两个表的操作是写在DAO中的,那我应该怎么样来实现这样的事务!跨层啊!
再一个就是一般系统中对于事务的处理应该怎样界定?尤其是跨层···
谢了
更新Document的逻辑包括三部分内容:实际文件上传到服务器,将相关文件记录写入Files表中,将Document的更新记录写入Document表!
那这样就有问题了,这三个动作肯定就是一个事务,要么全部完成,要么都不做!其中实际文件的上传是写在Logic层中的,而对于两个表的操作是写在DAO中的,那我应该怎么样来实现这样的事务!跨层啊!
再一个就是一般系统中对于事务的处理应该怎样界定?尤其是跨层···
谢了
要考虑的东西有很多,比如说事务的传播性等等,而且 DAO 中的 Connection 获取方式得重写改写,得从 ThreadLocal 中获得
当前请求线程中的 Connection 对象,并且在 DAO 中这个 Connection 还不能关。而且还必须确定事务的边界位于哪一层,如果
确定在哪一层的话,就采用动态代理,将这一层中的方法进行代理增强,在代理方法中开启事务,提交事务。呵呵,自己实现的话还是比较复杂的,只能建你使用开源框架来管理事务了,比如 Spring。
按照层次的概念来的话,我肯定是先完成上传文件,然后在做数据库操作。那要是上传文件结束了,写数据库的时候出问题了,那上传的文件岂不是成了垃圾文件,那该怎么办?
那只能在 catch 块中把那个文件删掉
cglib虽然不不用类使用接口,但原理还是一样的,他是继承了被代理类然后生成一个所谓cglib代理,可以说也是模拟一种接口实现