我们遇到了一个非常尴尬的问题。似乎某些网络或服务器错误导致前端应用程序两次获取生成器值。
是否有可能获取(和更新)生成器值保留在内存中,并且在断电的情况下,它保留在内存中不会被写入磁盘,所以当电源恢复时,它会丢失它的当前值,所以我们可以再次获得生成器值?
我们正在使用 Firebird 1.5.6、Delphi(BDE 和本地 IBExpert 组件)。
谢谢,圣诞老人
更新1:原来服务器是一些linux,如果有帮助的话......
我们遇到了一个非常尴尬的问题。似乎某些网络或服务器错误导致前端应用程序两次获取生成器值。
是否有可能获取(和更新)生成器值保留在内存中,并且在断电的情况下,它保留在内存中不会被写入磁盘,所以当电源恢复时,它会丢失它的当前值,所以我们可以再次获得生成器值?
我们正在使用 Firebird 1.5.6、Delphi(BDE 和本地 IBExpert 组件)。
谢谢,圣诞老人
更新1:原来服务器是一些linux,如果有帮助的话......
生成器值存储在数据库内的特殊专用页面上。更新是原子的,发生在正常事务控制之外,应立即存储。然而,当生成器频繁更改时,它会将 OS/RAID/HDD 视为“热”页面,不断写入但从不读取。因此,他们有很多动力将其缓存在内存中,而实际上很少将其刷新到媒体中。
如果您不惜一切代价想要速度,请禁用 FORCED WRITES - 或 - 在驱动器的设备管理器中启用 WRITE CACHE - 或 - 只是碰巧拥有一个 RAID 控制器,它以速度换取安全以获得良好的杂志评论:那么很有可能这些标题页在崩溃之前没有保存到 HDD。
阅读https://serverfault.com/questions/279571/lvm-dangers-and-caveats的答案中提到的链接:即使 FB 认为数据已保存,即使 Windows 认为是这样 - 它可能只是不真实的。另请阅读http://blogs.msdn.com/b/oldnewthing/archive/2013/04/16/10411267.aspx
或者你的程序可能有错误,包括 PSQL。
喜欢
i := GEN_ID (Name, 0);
i := GEN_ID (Name, 1);
或者
i := GEN_ID (Name, +1);
i := GEN_ID (Name, -1);
或者您可能在备份-恢复循环中有错误的选项,它们会重置生成器值。
我还建议您阅读 Firebird 2.0 到 3.0 Alpha 的所有发行说明 - 如果提到任何与生成器相关的错误,那么您很有可能在过时的 1.5.6 中遇到它们
如果您在不使用别名和使用不同路径的情况下连接到数据库,就会发生这种情况。然后 Firebird 认为它们是两个独立的数据库。一组内存缓存对另一组一无所知。
这可能会导致严重的数据库损坏,因此确保对数据库的所有访问都使用相同的路径非常重要。或者使用别名。