当只有一个事务写入数据库时,什么会在 Firebird 上触发死锁消息?
我正在在 Firebird 2.1 数据库之上构建一个后端用 Delphi2010 编写的 webapp。我收到一个我无法理解的并发更新错误。也许有人可以帮助我调试问题或解释可能导致该消息的场景。
我正在尝试对单个记录上的单个字段进行更新。
UPDATE USERS SET passwdhash=? WHERE (RECID=?)
我看到的消息是标准:
deadlock
update conflicts with concurrent update
concurrent transaction number is 659718
deadlock
Error Code: 16
我明白它告诉我什么,但我不明白为什么我会在这里看到它,因为我知道没有并发更新。
这是我所做的调查。
我启动了我的应用服务器并检查了这个查询的结果:
SELECT
A.MON$ATTACHMENT_ID,
A.MON$USER,
A.MON$REMOTE_ADDRESS,
A.MON$REMOTE_PROCESS,
T.MON$STATE,
T.MON$TIMESTAMP,
T.MON$TOP_TRANSACTION,
T.MON$OLDEST_TRANSACTION,
T.MON$OLDEST_ACTIVE,
T.MON$ISOLATION_MODE
FROM MON$ATTACHMENTS A
LEFT OUTER JOIN MON$TRANSACTIONS T
ON (T.MON$ATTACHMENT_ID = A.MON$ATTACHMENT_ID)
结果表明有多个连接,但其中只有一个在 MON$TRANSACTION 字段中具有非空值。这个连接是我从 IBExperts 用来查询监控表的连接。
我是否认为没有活动事务的连接可以被视为不会导致死锁情况?
接下来,我在我的应用程序服务器中提交 UPDATE-Statement 的行上放置一个断点,并执行触发它的请求。当断点停止应用程序时,我然后重新运行上面的 Monitor-query。
这一次我可以看到另一个交易活动,正如我所期望的:
然后我让我的应用服务器执行 UPDATE 并获得如上所示的错误消息。
当只有一个写入事务时,什么会触发死锁消息?或者还有更多,我误解了输出?关于如何调试它的任何其他建议?