Access前端连接MySQL/MariaDB遇写入冲突(3197错误)求解决
解决Access前端连接MariaDB/MySQL时的写入冲突(3197错误)问题
1. 完善时间戳字段的自动更新配置
你已设置timestamp非空且默认current_timestamp,但需补充自动更新规则:
- 对MariaDB/MySQL 5.6+,修改字段定义为:
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
Access依赖这个自动更新机制判断记录是否被修改,缺少ON UPDATE CURRENT_TIMESTAMP会导致误判记录变更,触发冲突。
2. 确认所有表都设置了主键
Access对ODBC后端表强制要求主键:
- 检查涉事表是否有明确主键(单一或复合主键均可),无主键的表会让Access无法正确识别和锁定记录,直接引发写入冲突。
3. 调整ODBC驱动的锁定与事务设置
打开MariaDB/MySQL ODBC数据源配置界面,修改以下选项:
- 将读取锁定设为
无或只读,避免不必要的记录锁定 - 启用使用事务,并将事务隔离级别设为
读取已提交(与SQL Server默认隔离级别一致) - 关闭自动提交,交给Access管理事务周期
4. 修改窗体的记录集与锁定属性
针对出现问题的连续窗体:
- 打开窗体设计视图,在属性窗口将记录集类型从
动态集改为动态集(不一致更新) - 把记录锁定属性设为
无锁定或编辑记录时锁定,避免过度锁定引发冲突
5. 优化更新操作的SQL逻辑
如果是通过存储过程或查询更新数据:
- 不要手动修改时间戳字段,交给数据库自动处理
- 更新语句必须明确指定主键条件,减少Access对记录状态的误判,示例:
UPDATE your_table SET column1 = ? WHERE primary_key = ?
6. 禁用Access的记录缓存
在问题窗体的VBA代码中添加如下内容,强制Access每次仅加载单条记录,避免缓存过期导致的冲突误判:
Private Sub Form_Load() Me.Recordset.CacheSize = 1 End Sub
内容的提问来源于stack exchange,提问作者Gerhard
相关产品推荐
相关产品推荐

