我的应用程序在访问 Firebird 数据库时有时会产生这种错误:
由于系统错误导致无法成功执行后续语句 GDS 代码:335544726 - SQL 代码:-902 - 错误代码:406'
可能是什么问题呢?有没有办法调试这个?
我在 Windows 7 上运行 Firebird 2.5.1。至少有带有 Python 的 kinterbasdb 和使用 Delphi 的 UIB 组件。
看起来原因是使用来自多个线程的相同连接/事务。
在我们切换到 UIB(从 IBX)之后,我们也遇到了很多这样的错误。
它是由 TUIBTransaction 的事务类型(Option)引起的。两者:
“Read Commited”:[tpNowait,tpReadCommitted,tpRecVersion]
和
“Snapshot”:[tpConcurrency,tpNowait]
由于“tpNowait”而导致相同。尤其是在从普通 HDD 切换到 SSD 之后。sleep(2);
(在每行之间插入,行TR.Start; sleep(2); ... TR.Commit;
有点帮助,但没有完全解决。)
我们不想简单地使用“tpWait”,因为这太冒险了,APP可能永远挂起。
所以解决方案是:
1.)将事务选项更改为“默认”。[tpConcurrency,tpWait,tpWrite]
2.)我们在每次开始事务之前在运行时设置。 (如果由于超时而失败,您可以以更高的值重复执行,但明智的做法是通知用户有关冻结的 UI。)TR.LockTimeOut := 5; //seconds
重要提示:
当前 (2016) UIB 代码根本无法处理LockTimeOut
。首先它必须被修复。在此处查看代码...