环境
我正在开发一个使用 SQL Native Client 9.0 与 SQL Server 2000 数据库通信的 C++ 应用程序。
设想
- 2 个连接打开到 DBMS
- 每个连接都设置为使用事务
- 关于
Connection1
作品的查询TableA
- 关于
Connection2
作品的查询TableB
TableB
key_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)
,调试器就会在永不着陆。
问题
我是否正确地将正在发生的事情诊断为死锁问题?
我收集到,因为Connection
1 正在创建一个键TableA
但没有提交它,然后由于外键约束,它Connection2
试图向其中添加信息TableB
,因此该键必须存在于TableA
. 因此,SQLExecute
查询阻塞,等待事务完成,由于代码的编写方式,在完成写入TableA
之前它无法执行此操作。TableB
补充笔记
我可以并且已经围绕这个问题进行了编码,但我想确保我对这个问题的理解是正确的。