ant*_*tik 4 c++ sql sql-server sqlncli
我正在使用一个C++应用程序,它使用SQL Native Client 9.0与SQL Server 2000数据库进行通信.
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
Run Code Online (Sandbox Code Playgroud)
我遇到的是查询(1)
成功执行但是一旦调用SQLExecute进行查询(2)
,调试器就会永远不会出现.
我是否正确地将正在发生的事情诊断为死锁问题?
我收集到了,因为Connection
1正在创建一个密钥TableA
但没有提交它,然后Connection2
尝试添加信息TableB
,因为外键约束,必须有密钥存在TableA
.因此,由于编写代码的方式,SQLExecute
查询会阻塞,等待事务TableA
完成,直到TableB
完成写操作才能执行.
我可以而且已经围绕这个问题编码,但我想确保我对这个问题的理解是正确的.
TableB对TableA的外键约束必须检查以确认密钥的存在.然后它将接受或拒绝TableB记录.
由于包含密钥的TableA记录(在不同的连接上)尚未提交,因此外键约束必须等待 - 在提交或回滚TableA记录之前,插入不会返回.
因为第一个连接上的提交等待TableB插入返回...您有死锁.
换句话说,你是对的.