2006/12/26

数据完整性

在数据库中,有一个功能叫做Transaction,它的意思是,如果要做一系列的更新、创建、或者删除操作的话,应该有一个显示Commit;如果Commit成功,则所有的改动都生效,如果Commit失败,则没有任何改动生效----而不是部分生效。

在涉及到数据存储的时候,通常也会很好的考虑这个问题,简单的办法就是做一个缓冲出来,全部写完之后一次性写入文件;这也要求尽量把有相关性的数据写在一个地方,否则很难保证不在多个文件写入的时候发生错误,导致数据不一致。

在对象中同样要考虑这个问题。虽然我们可以假定在函数返回错误的时候,传递的参数变量会失效(如果对象较大又不希望被改变的话,传递对象的Copy的引用,而不是直接传递引用),但是在返回错误的时候,如果本来有效的数据对象本身同样被摧毁,是不能接受的。所以不要在函数中直接改动成员变量,除非你明确知道不再可能有错误发生。不要做太大胆的假设,实际上除了MemMove这样屈指可数的几个函数之外,即使是内存分配也有发生错误的可能。较好的办法是做出一个成员变量的复制品,对这个复制品进行改动,如果过程中出现错误,丢弃这些复制品并返回错误;如果没有出现错误,那么用复制品对成员变量赋值,或者把指针指向复制品,把原件丢弃。

如果每个过程都遵循这样的原则设计,那么就不用为对象内部出现数据不一致担心了。

No comments: