上周带徒弟,删除一条记录时,卡了半天。还是学得不扎实。这里记下来。

一共分三步:

1. 行的删除,也就是置标记位。delete

2. 升效update

3. acceptchange

========================

其实原理都是一样的。

从人机交互到永久化(外存),分为三个层面。

UI----内存----外存


1. 从UI到内存的操作:Delete,可以认为是删除一行,其实是在内存中置一行的删除标记位。

2. 从内存到外存:Update,把内存的改变,写入到数据库。

3. 从外存到内存:这一步的目的是把数据库的改变,同步到内存中。表面上来看并无必要。实际是由于范围的不同造成的。

第一步的操作的范围仅是一条记录;Update则至少为表一级;那么,在内存中,与外存不同之外在于,外存是一种真实的物理存在,所以,一张表的数据,只可能有一个物理位置;相对地,内存中,可以存在同一帮表的多个映像。前面Update只是其中某个得到更新,它是与外存一致的;但其它的拷贝,并没有得到更新,所以,要调用整个记录集(datset),来accept change,才能保证这种一致性。

===================================

写了几遍也没有对,是因为把acceptchange和update的位置搞反了。

===================================

这里,可以看到,如果一个程序中,有多个datset 的实例,这种不同步,还是可能发生在dataset之间。

所以,好的办法是,一个进程里,只有一个dataset,这也是CS程序的一个特点,可以一直持有数据库的已经打开的connection,以加快运行的速度,如果你了解数据库的构造,你会理解,open一个connect是一个多么沉重的过程。

当然,许许多多BS程序,每个原子操作,都打开,操作,关闭,并以此为正确做法,这是相当可笑的。而且也是相当普遍的,有许多种方式,可以避免这么2X的编程方式。所以,不得不说,的确这十几年来,许许多多程序员被现实害了。比如最火的php加mysql,绝大多数的实现其实相当糟。以前我写过,本来一台普通PC就能完成了并发数,一个服务器集群现在都不够。

这是因为,数据库中,最值钱的,就是connection后面的内存缓存的实现。