SqlCE 刷新间隔 - 默认设置会导致损坏吗?

Posted

技术标签:

【中文标题】SqlCE 刷新间隔 - 默认设置会导致损坏吗?【英文标题】:SqlCE Flush Interval - Will the default setting lead to corruption? 【发布时间】:2010-06-11 16:51:25 【问题描述】:

SqlCE 在 Connect String 上有一个名为 Flush Interval 的参数集。定义为:

所有提交的事务刷新到磁盘之前的间隔时间(以秒为单位)。如果未指定,则默认值为 10。

认为提交的事务,顾名思义,是一个已刷新到磁盘的事务,特别是数据库文件。如果一个事务只存储在 RAM 中,那么该事务就不会轻易丢失吗?

我认为事务首先写入日志文件,然后应用到数据库文件本身,所以这个参数可能意味着等待事务日志应用到数据库文件的时间?

本来以为这个参数应该是0。

更新-------

让我戴上我的数据库内部组件。据我了解,当应用程序启动事务时,事务开始记录被写入数据库 LOG,然后每个添加、更改或删除的记录被写入 LOG,然后是事务结束记录。一个单独的线程检测到事务结束并将记录从 LOG 移动到 DATABASE。完成后,事务 ID 会递增以指示事务已完成。如果进程在任何地方崩溃,当数据库启动时,它将检查 LOG 以确定数据库的状态并完成或回滚打开的事务。所有这一切都意味着在该过程的所有步骤中都将工作写入磁盘。

如果 Flush Interval 是从 LOG 写入 DATABASE 的时间,那么一切都有意义,但如果事务保存在 RAM 中而不是 LOG 中,则数据库不能符合 ACID。

【问题讨论】:

谁说 SQL Server Compact 是 ACID? 【参考方案1】:

对于较新的版本,提交操作会超载。如果您使用 CommitMode.Immediate 参数调用 Commit,则 Flush-Interval 设置将被忽略,并且更改会立即保存到文件中。默认选项是CommitMode.Deferred(在无参数调用中),它基于 Flush-Interval 值。

请参阅我关于 SQLCE 损坏的帖子:resolving corruption in SQL Server Compact Edition database files

【讨论】:

【参考方案2】:

旧版本确实存在损坏问题。最新版本的最坏情况是缺少数据。

但是,您不能将参数设置为零。 1 是最小值。

【讨论】:

以上是关于SqlCE 刷新间隔 - 默认设置会导致损坏吗?的主要内容,如果未能解决你的问题,请参考以下文章

方法中的“使用”语句会导致数据损坏或访问冲突的麻烦吗?

函数节流与函数去抖

堆栈缓冲区溢出会导致堆损坏吗?

为什么重新安排时钟间隔会导致图像位置重置?

Interlocked.Increment 溢出会导致 .NET 运行时损坏吗?

支付系统资损分析