4

环境

我正在开发一个使用 SQL Native Client 9.0 与 SQL Server 2000 数据库通信的 C++ 应用程序。

设想

  • 2 个连接打开到 DBMS
  • 每个连接都设置为使用事务
  • 关于Connection1作品的查询TableA
  • 关于Connection2作品的查询TableB
  • TableBkey_id对中的字段有外键约束TableA

我构造了执行以下操作的函数:

begin a transaction on Connection1 & Connection2
prepare a query in TableA on Connection1
prepare a query on TableB on Connection2

begin loop over some_data
   (1) insert into key_id on TableA

   begin loop over some_other_data
      (2) insert into TableB using same key_id as in Table A
   end loop
end loop

commit on Connection1
commit on Connection2

我遇到的是查询(1)成功执行,但只要调用 SQLExecute 进行查询(2),调试器就会在永不着陆。

问题

我是否正确地将正在发生的事情诊断为死锁问题?

我收集到,因为Connection1 正在创建一个键TableA但没有提交它,然后由于外键约束,它Connection2试图向其中添加信息TableB,因此该键必须存在于TableA. 因此,SQLExecute查询阻塞,等待事务完成,由于代码的编写方式,在完成写入TableA之前它无法执行此操作。TableB

补充笔记

我可以并且已经围绕这个问题进行了编码,但我想确保我对这个问题的理解是正确的。

4

1 回答 1

7

TableB 对 TableA 的外键约束必须检查以确认键的存在。然后它将接受或拒绝 TableB 记录。

因为包含键的 TableA 记录(在不同的连接上)尚未提交,所以外键约束必须等待 - 插入不会返回,直到 TableA 记录被提交或回滚。

因为第一个连接上的提交等待 TableB 插入返回......你有死锁。

换句话说,你是对的。

于 2008-11-20T16:16:30.193 回答