Sán*_*más 1 delphi firebird bde delphi-7 firebird1.5
我们遇到了一个非常尴尬的问题.似乎某些网络或服务器错误导致前端应用程序获得两次生成器值.
是否有可能获取(和更新)生成器值保留在内存中,并且在断电的情况下,它保留在内存中不会被写入磁盘,因此当电源恢复时,它会丢失它的当前值,所以我们可以再次获得发电机价值?
我们使用的是Firebird 1.5.6,Delphi(BDE和本地IBExpert组件).
谢谢,SanTa
更新1:原来,服务器是一些Linux,如果它有帮助...
生成器值存储在数据库内的特殊专用页面上.更新是原子的,发生在正常的事务控制之外,应该立即存储.然而,当发电机频繁更换时,它会将OS/RAID/HDD视为"热门"页面,不断写入并且永远不会读取.因此,他们有很大的动力来保持缓存在内存中,而实际上很少将其刷新到媒体中.
如果你不惜一切代价想要速度,禁用FORCED WRITES - 或 - 在设备管理器中为驱动器启用WRITE CACHE - 或者 - 只是偶然有一个RAID控制器,为了获得良好的杂志评论而换取安全速度:那么很可能在崩溃之前,那些标题页没有保存到HDD.
阅读https://serverfault.com/questions/279571/lvm-dangers-and-caveats答案中提到的链接:即使Windows认为数据已保存,即使Windows认为如此 - 这可能只是不真实.另请阅读http://blogs.msdn.com/b/oldnewthing/archive/2013/04/16/10411267.aspx
或者你可能在程序中有错误,包括PSQL.
喜欢
i := GEN_ID (Name, 0);
i := GEN_ID (Name, 1);
Run Code Online (Sandbox Code Playgroud)
要么
i := GEN_ID (Name, +1);
i := GEN_ID (Name, -1);
Run Code Online (Sandbox Code Playgroud)
或者你可能在备份 - 恢复循环中有错误的选项,它会重置生成器值.
我还建议您阅读Firebird 2.0到3.0 Alpha的所有发行说明 - 如果有人提到任何与发生器相关的错误,那么你很有可能在过时的1.5.6中使用它们