6

我的应用程序在访问 Firebird 数据库时有时会产生这种错误:

由于系统错误导致无法成功执行后续语句 GDS 代码:335544726 - SQL 代码:-902 - 错误代码:406'

可能是什么问题呢?有没有办法调试这个?

我在 Windows 7 上运行 Firebird 2.5.1。至少有带有 Python 的 kinterbasdb 和使用 Delphi 的 UIB 组件。

4

2 回答 2

2

看起来原因是使用来自多个线程的相同连接/事务。

于 2012-10-18T23:16:17.160 回答
1

在我们切换到 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。首先它必须被修复。在此处查看代码...

于 2019-08-19T18:33:48.667 回答