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

ColdFusion 2016搭配MS Access执行记录删除偶发“记录已删除”报错

故障现象
  • 自研加密货币机器人主体功能运行正常,偶发数据删除类数据库错误
  • 触发场景:手动重载页面、触发页面自动重载时复现,触发窗口为:目标记录刚完成删除操作、新数据尚未写入数据表,或表内出现#deleted#临时标记的阶段
  • 运行环境:ColdFusion 2016 + MS Access
  • 现有业务逻辑:每次页面加载时向表中写入最新币种价格数据,同时删除30分钟前的历史旧数据,避免价格数据库因持续累积导致体积过大
  • 完整报错信息:

Error Executing Database Query. [Macromedia][SequeLink JDBC Driver][ODBC Socket][Microsoft][ODBC Microsoft Access Driver] Record is deleted.
The error occurred on line 4.

  • 现有删除操作代码:
<cfquery name="trdel" datasource="kickin_crypto">
    delete * from bot_data
    where prtime <= #createODBCDateTime(timethirty)#
</cfquery>
根因分析

这个报错是MS Access文件型数据库的典型并发冲突问题,和SQL语法错误无关:

  • MS Access没有企业级数据库的行级锁机制,删除记录时不会立刻完成物理删除,会先给对应记录打上#deleted#临时标记,等操作提交、连接释放锁资源后才会完成最终的记录清理
  • 现有逻辑将「删除30分钟旧数据」和「写入最新价格」两个操作绑定在每次页面加载流程中,当出现并发页面请求(比如多次手动刷新、自动刷新和用户操作撞期),一个请求正处于删除打标记的阶段,另一个请求刚好读取/写入到了标记为待删除的记录段,就会抛出该错误
  • 原删除代码直接拼接时间值、使用Access非标准DELETE *写法,一定程度上也会提升驱动解析异常的概率。
修复方案

按优先级落地以下调整即可解决问题:

  1. 加事务包裹并调整执行顺序
    用ColdFusion事务标签将删除、写入操作包裹,设置最高隔离级别避免并发读写冲突,同时修正SQL写法、加参数绑定:
    <cftransaction isolation="SERIALIZABLE">
        <!--- 先执行旧数据清理,再写入新数据,避免读写交叉 --->
        <cfquery name="trdel" datasource="kickin_crypto">
            DELETE FROM bot_data
            WHERE prtime <= <cfqueryparam value="#createODBCDateTime(timethirty)#" cfsqltype="cf_sql_timestamp">
        </cfquery>
        <!--- 此处放原有写入最新币种价格的cfquery逻辑 --->
    </cftransaction>
    
  2. 降低清理操作的执行频率
    不要每次页面加载都触发旧数据删除,增加简单的时间阈值判断:比如用Application作用域变量记录上次清理的时间戳,间隔满1小时才执行一次删除操作。30分钟旧数据的清理不需要精确到每次页面请求触发,调整后能把并发冲突的概率降到极低,完全不影响业务逻辑。
  3. 定期维护Access数据库
    Access长期执行增删操作会产生数据碎片,未及时清理的残留#deleted#标记也会提升报错概率,建议每周在业务低峰期对Access数据库文件执行一次「压缩和修复」操作,减少底层数据异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:06:09