Jet OLEDB:事务提交模式和Jet OLEDB:用户提交同步有什么区别?

2023-12-12

虽然Jet/OLEDB参数都比较有据可查我无法理解这两个连接参数之间的区别:

第一个:

Jet OLEDB:事务提交模式(DBPROP_JETOLEDB_TXNCOMMITMODE)

指示Jet是否写入数据 同步或异步磁盘 当事务提交时。

第二个:

Jet OLEDB:用户提交同步(DBPROP_JETOLEDB_USERCOMMITSYNC)

指示是否进行了更改 交易中进行的写入被写入 同步或异步模式。

有什么不同?什么时候用哪个?


这很长,所以这是简短的答案:

不要设置其中任何一个。这两个选项的默认设置可能是正确的。第一种是事务提交模式,控制Jet的隐式事务,并在显式事务之外应用,并设置为YES(异步)。第二个控制 Jet 在显式事务期间如何与其临时数据库交互,并设置为 NO(同步)。我想不出您想要在这里覆盖默认值的情况。但是,您可能需要显式设置它们,以防您在 Jet 数据库引擎设置已更改为默认值的环境中运行。

现在,长解释:

我翻遍了很多Jet相关的资源,看看能否找出这里的情况。这两个 OLEDB 常量似乎映射到顶级 DAO DBEngine 对象的 SetOptionEnum 的这两个成员上(详细信息here对于那些没有可用的 Access 帮助文件的人):

  dbImplicitCommitSync 
  dbUserCommitSync 

这些选项用于在运行时针对任何特定连接覆盖 Jet 数据库引擎的默认注册表设置,或者永久更改注册表中存储的设置。如果您在注册表中查找 HLKM\Software\Microsoft\Jet\X.X\,您会发现在您正在使用的 Jet 版本的项下有一些项,其中两个是:

  ImplicitCommitSync
  UserCommitSync

Jet 3.5 数据库引擎程序员指南定义了以下内容:

  • ImplicitCommitSync:值为 Yes 表示 Microsoft Jet 将等待提交完成。除 Yes 之外的值表示 Microsoft Jet 将异步执行提交。

  • UserCommitSync:当设置值为“是”时,Microwsoft Jet 将等待提交完成。任何其他值都意味着 Microsoft Jet 将异步执行提交。

现在,这只是您已经说过的话的重述。令人沮丧的是,第一个默认值为 NO,而第二个默认值为 YES。如果他们确实控制着同一件事,你会期望它们具有相同的值,否则冲突的值将成为问题。

但关键实际上在于名称,它反映了 Jet 关于如何在事务内部和外部提交数据写入的历史。在 Jet 3.0 之前,Jet 默认在显式事务之外进行同步更新,但从 Jet 3.0 开始,引入了隐式事务,并且默认使用隐式事务(Jet 3.5 中有一些注意事项 - 见下文)。因此,这两个选项之一适用于事务外部提交 (dbImplicitCommitSync),另一个选项适用于事务内部提交 (dbUserCommitSync)。我最终在《Jet Database Engine 程序员指南》(第 607-8 页)中找到了这些内容的详细解释:

用户提交同步UserCommitSynch 设置决定 所做的更改是否作为 显式事务...被写入 数据库在同步模式或异步模式。默认值...是 Yes,它指定 异步模式。它不是 建议您更改此值 因为在同步模式下,有 不保证该信息已被 在代码之前写入磁盘 继续执行下一个命令。

隐式提交同步默认情况下,当 执行添加操作, 删除或更新外部记录 显式事务、Microsoft Jet 自动执行内部 交易称为隐含的 交易暂时保存的 其内存缓存中的数据,然后 之后将数据作为块写入 磁盘。 ImplicitCommitSync 设置 确定是否进行更改 使用隐式事务是 同步写入数据库 模式或异步模式。默认 value...为 No,它指定 这些更改被写入 数据库采用异步模式;这 提供最佳性能。如果你 希望隐式交易成为 同步写入数据库 模式,将值...更改为是。如果 你改变了价值......你得到 与 Microsoft Jet 类似的行为 版本 2.x 及更早版本,当您 没有使用显式事务。 然而,这样做也会损害 性能相当大,所以它不是 建议您更改该值 这个设置。

注意:不再需要使用 显式交易以改善 Microsoft Jet 的性能。 A 使用 Microsoft 的数据库应用程序 Jet 3.5 应该使用显式 仅在以下情况下进行交易 可能需要回滚 变化。 Micosoft Jet 现在可以 自动执行隐式 交易以提高绩效 每当添加、删除或更改时 记录。然而,隐含的 SQL DML 语句的事务 已在 Microsoft Jet 中删除 3.5...参见“删除SQL DML语句的隐式事务” 在本章后面。

该部分:

删除 SQL DML 语句的隐式事务即使所有工作都在微软 Jet 3.0 消除交易 为了获得更好的性能, 仍然放置 SQL DML 语句 在隐式事务中。在 Microsoft Jet 3.5、SQL DML 语句 没有被放置在隐式中 交易。这实质上 提高运行 SQL 时的性能 影响很多的 DML 语句 数据记录。

虽然这一变化提供了 显着的性能改进, 它还引入了一个变化 SQL DML 语句的行为。什么时候 使用 Microsoft Jet 3.0 及更早版本 使用隐式的版本 SQL DML 语句的事务, SQL DML 语句回滚(如果有) 声明的一部分不是 完全的。使用 Microsoft Jet 时 3.5、有可能有一些记录通过SQL DML提交 声明,而其他人则没有。一个 这方面的例子是当 Microsoft Jet 缓存已超出。这 将缓存中的数据写入磁盘 下一组记录是 修改并放入缓存中。 因此,如果连接是 终止,可能有些 的记录已保存到磁盘,但是 其他人则不然。这是一样的 使用 DAO 循环例程的行为 无需明确更新数据 Microsoft Jet 3.0 中的事务。如果 你想避免这种行为,你 需要添加显式交易 围绕SQL DML语句来定义 一套工作,你必须牺牲 性能增益。

还困惑吗?我当然是。

对我来说,关键点似乎是 dbUserCommitSync 似乎控制 Jet 写入用于暂存显式事务的临时数据库的方式,而 dbImplicitCommitSync 与 Jet 在显式事务之外使用其隐式事务的位置有关。换句话说,dbUserCommitSync 控制 BeginTrans/CommitTrans 循环内引擎的行为,而 dbImplicitCommitSync 控制 Jet 在显式事务之外的异步/同步方面的行为方式。

现在,关于“隐式事务的删除”部分:我的理解是,当您在事务外部循环记录集时,隐式事务适用于更新,但不再适用于事务外部的 SQL UPDATE 语句。按理说,提高逐行更新性能的优化会很好,但实际上对 SQL 批量更新没有太大帮助,因为 SQL 批量更新已经非常快了(相对而言)。

另请注意,事实上,可以通过两种方式执行此操作,这使得 DoCmd.RunSQL 能够进行不完整的更新。也就是说,如果使用 DoCmd.RunSQL 执行,则因 CurrentDB.Execute strSQL、dbFailOnError 失败的 SQL 命令可以运行完成。如果您关闭 DoCmd.SetWarnings,您不会收到错误报告,并且您没有机会回滚到初始状态(或者,如果您被告知错误并决定提交,无论如何) )。

所以,我认为发生的事情是,通过 Access UI 执行的 SQL 默认情况下包装在事务中(这就是您获得确认提示的方式),但是如果您关闭提示并且出现错误,您将获得不完整的更新应用。这与 DBEngine 设置无关——这是 Access UI 执行 SQL 的方式问题(并且有一个选项可以关闭/打开它)。

这与 DAO 中的更新形成鲜明对比,从 Jet 3.0 开始,DAO 全部包含在隐式事务中,但从 Jet 3.5 开始,只有顺序更新包含在隐式事务中,而批处理 SQL 命令(INSERT/UPDATE/DELETE)则不然。

至少,这是我的阅读。

因此,关于您实际问题中的问题,在设置 OLEDB 连接时,您需要根据您正在做的事情为该连接设置 Jet DBEngine 的选项。在我看来,默认的 Jet DBEngine 设置是正确的,不应更改 - 您希望使用隐式事务进行编辑,在其中遍历记录集并一次更新一行(在显式事务之外) 。另一方面,您可以将整个事务包装在事务中并获得相同的结果,所以实际上,这仅适用于您正在遍历记录集并更新且未使用显式事务的情况,并且默认设置似乎对我来说非常正确。

在我看来,另一个设置 UserCommitSync 也是您绝对不想保留的设置,因为在我看来,它适用于 Jet 在显式事务期间与其临时数据库交互的方式。在我看来,将其设置为异步非常危险,因为您基本上不知道提交数据时操作的状态。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jet OLEDB:事务提交模式和Jet OLEDB:用户提交同步有什么区别? 的相关文章

  • OleDB更新命令不改变数据

    我使用 Microsoft Access 文件作为数据库 我没有问题SELECT and INSERT查询 但当我尝试UPDATE 数据库中的记录不会改变 下面是我用来运行更新的代码 调试日志中没有异常或错误 cnn new OleDbCo
  • 如何通过 OLEDB 或 SSIS 中的任何其他源连接 Excel 源?

    除了 Excel 连接管理器 之外 还有其他方法可以将 Excel 连接为 SSIS 中的源吗 我问这个问题是因为我在使用 Excel 连接管理器 连接 Excel 时遇到问题 因为在我的系统中安装了 32 位 Excel 而 Visual
  • 使用 OLEDB / Microsoft Jet 驱动程序会导致 Excel 文件中出现“数字存储为文本”

    我在使用 C 中的 OLDEDB 将条目写入 Excel 文件时遇到问题 本质上我想使用 Excel 模板文件来格式化一些信息 这个想法是用户可以运行查询 它将结果填充到 Excel 文件中 然后用户可以继续使用 Excel 来操作结果 为
  • ALTER TABLE 语句中的 DEFAULT 子句导致语法错误

    我有一位客户想要定制一个旧的 Visual Basic 5 应用程序 该应用程序使用 Access 97 数据库和 Jet 3 5 作为数据库引擎 所需的自定义需要将一列添加到现有表中 以下工作正常 strSQL ALTER TABLE U
  • Access 中的多个 LEFT JOIN

    我有以下查询 适用于 MySQL DELETE test1 test2 test3 test4 FROM test1 LEFT JOIN test2 ON test2 qid test1 id LEFT JOIN test3 ON test
  • 我无法打开 .xlsx 文件

    我想打开一个 xlsx 文件 我尝试了下面的代码 但它既没有打开也没有抛出任何错误 任何人都可以阐明它吗 string path C examples file1 xlsx string connString string Format P
  • C#.Net,获取OLEDB提供程序版本

    我需要确定已安装的 OLEDB 提供程序版本 在读取 Excel 文件之前 我怎样才能做到这一点 您可以使用 OleDbEnumerator GetElements 方法 http msdn microsoft com en us libr
  • OleDb SQL 查询中的两个内部联接[重复]

    这个问题在这里已经有答案了 我正在尝试使用 OleDbCommand 对 Access 数据库 accdb 进行 SQL 查询 虽然这个命令工作正常 在OleDbCommand ExecuteReader string command SE
  • 删除 5 条记录,但 RecordsAffected 属性为 0

    这是一个代码片段 Private Sub frmSearch UnMarkAll Const sqlD As String DELETE FROM PickList WHERE TableName CARS AND KeyNo IN SEL
  • 如何将数据导出到 Excel 文件

    我有一个 Excel 文件 其中包含数据 我想将它的一些特定行写入我通过代码创建的另一个 Excel 文件 顺便说一句 我在列表中列出了这些行的索引 我怎样才能做到这一点 MS 提供 OpenXML SDK V 2 5 请参阅https m
  • Microsoft ACE 驱动程序更改了程序其余部分中的浮点精度

    我遇到一个问题 在使用后 某些计算的结果似乎发生了变化微软 ACE 驱动程序 http www microsoft com en us download details aspx id 13255打开 Excel 电子表格 下面的代码重现了
  • 缺少引用 OLEDB 连接类型的库

    我从以下代码中得到了SSIS 团队博客 http blogs msdn com b mattm archive 2008 08 22 accessing oledb connection managers in a script aspx转
  • 如何在 where 子句中使用别名?

    我试图在多列文本和备忘录中搜索我不想看到的某些短语和黑名单短语 假设如下表 stories id title author publisher content 前任 我想找到所有提到 在任何领域 苹果 但将 苹果酱 列入黑名单的故事 SEL
  • 通过 C# 和 OleDb 将行插入 Excel 电子表格

    我需要以编程方式将一行多次插入 Excel 电子表格中 我需要实际上插入一个新行并且不插入数据 也就是说 我实际上需要将所有其他行向下移动一位 我目前正在使用 OleDB 插入数据本身 如下所示 Note I have missed som
  • 通过 OleDb ACE 访问 Excel 2007 二进制文件 (.xlsb)

    我发现 Excel 2007 二进制格式 扩展名为 xlsb 非常完美 适合我的需求 因为它加载速度快且非常紧凑 我交付一个 Excel 中的一堆报告包含大量数据 这些报告是 实际上正在加载一个 IS 包 所以我假设转换为这种格式 请阅读有
  • OleDbConnection() 在任何打开的 Excel 窗口中打开 Excel 文件。但如果没有打开窗户则不会

    我正在编写一个使用OleDbAdapter访问 Excel 文件中的信息 当我尝试创建与 Excel 文件的连接时 如果用户在桌面上打开了另一个 不相关的 Excel 文件 则适配器连接到的文件会在此窗口中以只读格式打开 如果用户没有打开
  • 使用OLEDB从Stream读取AccessFile到DataSet

    我使用 Oledb 将 AccessFile accdb 读取到 DataSet 我不知道表名或列 常规实现是 public void GetAccessDB string filepath this ConnectionString Pr
  • 使用 C# 和 OleDbConnection 从特定工作表的 Excel 文件中获取列名称

    到目前为止 我已经设法获取整个Excel文件的列名 但我想做的是获取给定表 工作表 的Excel文件的列名 我该如何修改代码来实现这一目标 我已经尝试了一段时间 但没有取得积极的结果 非常感谢任何帮助 public static List
  • 导出到 Excel 电子表格 (XLSX) 失败

    使用 ASP NET 网页 我将一些数据导出到 Excel 电子表格 XLSX 当我使用 Visual Studio 运行代码时 代码运行良好 它正在导出具有正确数据的 XLSX 文件 但在部署到测试服务器时 相同的代码会失败 它不会抛出任
  • Paradox 表 - Oledb 异常:外部表不是预期的格式

    我正在使用 Oledb 从 Paradox 表中读取一些数据 我遇到的问题是 当我将代码复制到控制台应用程序时 代码可以工作 但在 WinForms 中却不行 两者都以 x86 进行调试 我实际上只是复制代码 在 WinForms 应用程序

随机推荐