我正在开发一个使用SQL Native Client 9.0与SQL Server 2000数据库通信的C ++应用程序。
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)
成功执行但是只要为查询(2)
调用SQLExecute,调试器就会永远不会落地。
我是否正确地将正在发生的事情诊断为死锁问题?
我收集到了,因为Connection
1正在TableA
创建密钥但未提交密钥,然后Connection2
正在尝试向TableB
添加信息,因为外键约束,必须具有TableA
中的密钥。因此,SQLExecute
查询阻塞,等待TableA
上的事务完成,直到TableB
完成其写入才能完成,这要归功于编写代码的方式。 / p>
我可以而且已经围绕这个问题编码,但我想确保我对这个问题的理解是正确的。
答案 0 :(得分:7)
TableB对TableA的外键约束必须检查以确认密钥的存在。然后它将接受或拒绝TableB记录。
因为包含密钥的TableA记录(在不同的连接上)尚未提交,所以外键约束必须等待 - 在提交或回滚TableA记录之前,插入不会返回。
因为第一个连接上的提交等待TableB插入返回...你有死锁。
换句话说,你是对的。