是否有可能获得两次发电机值?

时间:2013-07-16 13:44:19

标签: delphi delphi-7 firebird bde firebird1.5

我们遇到了一个非常尴尬的问题。似乎某些网络或服务器错误导致前端应用程序两次获得生成器值。

获取(和更新)生成器值是否可能保留在内存中,并且在断电的情况下,保留在内存中不会被写入磁盘,所以当电源恢复,它会失去当前值,所以我们可以再次获得发电机值吗?

我们正在使用Firebird 1.5.6,Delphi(BDE和本地IBExpert组件)。

谢谢, SANTA

更新1:事实证明服务器是一些Linux,如果它有帮助......

2 个答案:

答案 0 :(得分:5)

生成器值存储在数据库内的特殊专用页面上。更新是原子的,发生在正常的事务控制之外,应该立即存储。但是,当发电机频繁更换时,它会将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中使用它们

答案 1 :(得分:0)

如果您在不使用别名和使用不同路径的情况下连接到数据库,则会发生这种情况。然后Firebird认为它们是两个独立的数据库。并且一组内存缓存对另一组没有任何了解。

这可能会导致严重的数据库损坏,因此确保对数据库的所有访问都使用相同的路径非常重要。或者使用别名。