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