2012-11-12 58 views
1

我有一个DocumentStore(一个网络共享的时间期限)和一个数据库,其中包含与复制到商店中的文档相关的条目。 我将要使用的数据库行的文件名的自动生成(INT)ID和分区的目录结构(如ID = 4433最终将被投入到“\ 004 \ 433 \ 0000004433.xxx”)通过网络共享使用File.Move安全/高效吗?

我显然不能在复制文件时对数据库进行任何锁定,但我不确定哪个策略可以采取更好的策略:

a)向数据库添加一行以获取ID(推测使用InProgress标志),将文件复制到目标位置,然后再次更新行以清除复制成功后的标志。

b)将文件复制到共享根目录下的临时文件名;完成后,将新行插入数据库以获取ID并调用File.Move将临时文件移动到正确的目的地。如果插入/移动文件在交易中完成,则任何失败都将意味着插入被回滚并且其他任何人都看不到

(b)如果确实是移动而不是复制/删除,这是安全的吗?

+0

Tilak/Zdravko:复制/删除不适用于场景b,因为数据库事务处于打开状态 - 它需要(几乎)瞬间完成。我需要确定的是,Move功能(即只是改变目录指针)仍然适用,即使从不持有共享的机器调用。 –

回答

0

移动是完全安全的。与进入网络共享时的复制/删除没有多大区别。

0

移动与复制/删除一样安全。

如果源和目标在不同的卷上,移动不会从源删除。要么它会复制或不会复制。

Move = Copy if volume are different. (File.Delete is required to delete source file). 
Move = Copy + Delete is volume is same. 

除了上述以外,使用移动/移动+删除或复制+删除没有区别。