OAF页面FND_RECORD_CHANGED_ERROR报错及变量差异解读咨询
OAF FND_RECORD_CHANGED_ERROR 字段差异问题解读
首先明确Oracle OAF底层依赖的ADF BC框架中EntityImpl三个核心属性的定义:
mData:Entity对象当前内存中加载的最新数据快照。你观测到该值与数据库完全一致,说明触发lock()操作前,框架已经执行过最新数据拉取动作,可能是自定义逻辑触发,也可能是框架自动刷新逻辑触发。mOrigData:Entity对象首次从数据库查询出来时存储的原始数据快照,是框架做乐观锁校验的基准值。执行lock()方法时,框架会将mOrigData存储的旧值与当前数据库行值做比对,不一致就会抛出RowInconsistentException,对应你遇到的FND_RECORD_CHANGED_ERROR报错。mChanged:标记Entity对象中被当前会话修改过的字段的布尔数组,只有标记为已修改的字段,才会被拼入后续UPDATE语句中。
你当前观测到mData与数据库一致但mOrigData存在差异,核心原因是Entity对象首次查询完成后,到触发lock()操作的时间段内,出现了未同步mOrigData的行数据变更,常见触发场景如下:
- 并发更新:当前用户加载页面获取行数据后,其他会话修改了同一行数据并提交事务,
mOrigData还是当前用户首次加载的旧值,和数据库最新值不匹配。 - 当前会话隐式更新:同一请求逻辑中,首次查询Entity后,又通过其他Entity实例、原生JDBC、PL/SQL存储过程修改了同一条数据库行,没有主动调用
refresh()方法同步初始Entity的mOrigData,部分场景下框架会隐式刷新mData但不会自动更新mOrigData,就会出现你观测到的差异情况。 - 自定义扩展逻辑不规范:如果你的OAF扩展代码直接修改了
mData的字段值,没有走框架标准的setAttribute()方法,也会导致mOrigData没有同步更新,和mData、数据库值产生差异。
对应解决方向:
- 全链路排查当前请求逻辑,确认是否存在查询Entity后未同步Entity状态的数据库更新操作
- 并发场景可调整OAF页面乐观锁策略,或操作前增加行级锁校验逻辑
- 排查自定义扩展代码,禁止直接操作Entity内部属性,所有字段修改走框架标准API
内容的提问来源于stack exchange,提问作者aikrikunov95
相关产品推荐
相关产品推荐

