cat*_*eof 7 c++ oracle multithreading occi
我们使用occi来通过C++进程访问Oracle 12.其中一个操作必须确保客户端必须在数据库中选择最新数据并根据最新值进行操作.声明是
std::string sqlStmt = "SELECT REF(a) FROM O_RECORD a WHERE G_ID= :1 AND P_STATUS IN (:2, :3) FOR UPDATE OF PL_STATUS"
Run Code Online (Sandbox Code Playgroud)
(我们正在使用TYPES).由于某种原因,此命令没有通过,数据库表是LOCKED.所有其他操作都在等待第一个线程完成,但线程被杀死,我们已经到达了一个deadend.
什么是避免这种灾难性事件的最佳解决方案?我可以在语句中设置超时,以便线程可以在"select for update"上运行100%,让我们说最多10秒?换句话说,执行线程可以锁定数据库表/行但不超过预定时间.
这可能吗?
有一个会话参数ddl_lock_timeout,但没有dml_lock_timeout。所以你不能走这条路。所以要么你必须使用
SELECT REF(a)
FROM O_RECORD a
WHERE G_ID= :1 AND P_STATUS IN (:2, :3)
FOR UPDATE OF PL_STATUS SKIP LOCKED
Run Code Online (Sandbox Code Playgroud)
并修改应用逻辑。或者您可以实现自己的中断机制。只需触发一个并行线程并在一段时间后执行即可OCIBreak。它是有文档记录并受支持的解决方案。调用OCIBreak是线程安全的。被阻塞的SELECT .. FOR UPDATE语句将被释放,你会得到一个错误ORA-01013: user requested cancel of current operation
因此,在 OCCI 级别上,您必须处理此错误。