现在,事情好像都已经有解决方案了
在数据层(我先这么描术),可以在数据库的存储过程中用使用事务
在中间层(或者叫逻辑层,我先这么描术),可以用DTS,MTS,COM+
在前台(或都叫表示层,我先这么描术),可以用ADO.NET的事物机制
当然,ADO.NET也可以写中间层,COM+也可放到前台,存储过程中也能用ADO.NET,COM+
可是不管如何,事情好像都已经有解决方案了,要System.Transactions出来干吗
因为有的数据库不支持事务............
因为写代码不只是为了操作数据库...............
相信大家都有类似这样的经历:
将一个大目录(有N多子目录与文件)剪切到另一个磁盘上(可能要60分钟以上),
如果这时当机了.....................
如果System.IO类支持事务,以上问题就不用考虑了
其实没有支持事务的IO也不要紧,我们可以自已实现
第一种方式:
1.先将这个大目录复制的要剪切到的磁盘的同级目录,名为temp
2.复制完成后,删除原目录。
3.将temp目录改名为原目录名
这里有两类操作,复制与删除叫过程操作,改名叫瞬间操作。
过程操作,我们认为有明显的阶段性,有发生中断的可有,对资有很大的依赖性
瞬间操作,我们认为无法操制其过程,发生中断的可能性很小,可以认为其不可能在操作进行中出现阶段
性错误。
当然,以是中相对的,操作系统的瞬间操作,对CPU来说可能是一个过程操作,
我们不能把代码的逻辑错误,服务器的电源故障冗余方案,与CPU的过热保护放到一段代码中去实现
也就是说事物处理是靠非事务性代码用逻辑关系实现的,事物也有可能无法回滚事最初状态,
面对这种情况,我们要做的就是合理的划分操作单元,完善逻辑关系(具体后面再细谈)
第二种方式:
对原目录的文件结构建立一个清单,每复制一个文件,就在清单中标记一下,复制完成后再从原目录中删除文件。
好了,不管代码效率如何,总算有了自已IO事物的解决方案,
那我们还要System.Transactions类干吗........
浙公网安备 33010602011771号