You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Access前端连接MySQL DAO模式下窗体无法增改记录锁冲突问题

问题现象

使用DAO连接MySQL的Access应用执行UPDATE操作时,测试SQL如下:

UPDATE tblFormateur 
SET Prenom = 'Werner' 
WHERE Nom='HEISENBERG'

执行时出现固定规律异常:

  • 首次运行查询可正常执行
  • 第二次运行相同查询,且更新值与字段现有值完全一致时,直接抛出锁冲突错误,查询终止
  • 若修改更新值为其他内容(例如将Prenom改为'Peter'),查询可正常执行
  • 换用ADODB执行相同逻辑不会触发该报错
    该问题直接导致基于DAO实现的所有Access窗体无法完成新增、更新记录操作。
运行环境
  • 操作系统:Windows 11
  • Access版本:Office 365
  • ODBC驱动:MySQL ODBC Connector 8.0 CE
解决方案

该问题是DAO与MySQL ODBC 8.0默认配置的兼容问题,属于该技术栈的常见已知问题,无需重构现有DAO逻辑,调整ODBC配置即可修复:

  1. 核心配置调整
    打开对应位数的ODBC数据源管理器(32位Access需运行C:\Windows\SysWOW64\odbcad32.exe,64位Access可直接从系统搜索打开ODBC数据源管理器),找到你使用的MySQL连接DSN进入配置页,在高级选项中勾选返回匹配行(Found rows instead of affected rows)。
    该配置的作用是让MySQL返回WHERE条件匹配的总行数,而非实际发生值变更的行数。DAO默认会根据执行返回的行数判定操作是否成功,当更新值与原值一致时,MySQL默认返回的变更行数为0,DAO会将该结果误判为记录被其他会话锁定,从而抛出锁冲突错误。
    如果你使用无DSN的VBA动态连接串,不需要手动配置DSN,直接在连接字符串末尾添加Option=2即可等价开启该配置。
  2. 补充优化配置
    • 在ODBC高级配置中取消勾选「启用多语句执行」「自动提交隐式事务」相关选项,将事务隔离级别调整为读已提交(Read Committed),可减少大部分DAO操作MySQL时的隐式锁残留问题
    • 避免使用8.0.27~8.0.33区间的MySQL ODBC驱动版本,这些版本存在DAO元数据读取的已知bug,会额外触发随机锁报错,可升级到最新的8.0.x稳定版,或回退到5.3.x版本ODBC驱动直接规避兼容问题
  3. 验证方式
    配置调整后可直接在Access查询设计器中执行两次相同的UPDATE语句(更新值与原值一致),不再抛出锁冲突即代表修复生效,原有绑定DAO的窗体不需要做任何代码修改即可恢复新增、更新功能。

内容的提问来源于stack exchange,提问作者Philippe PONS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 14:45:42