这个问题是关于并发高速插入的。我必须承认这在我看来很有趣。
我正在使用 SQL Server 2008 R2 执行 T-SQL 插入和插入触发器之后。
我想确保在插入与其后插入触发器之间不会执行任何命令。
使用隔离级别会导致死锁或不能解决问题。
我正在使用的过程是从菲尔到 SQL Server 依赖身份的答案/解决方案 - 有这样的事情吗?
问题是:
有时插入在前一个插入与其后插入触发器之间,导致此结果:
RoomID ItemID ItemDescription ID
------ ------ --------------- --
7 1 Door 1
7 2 Window (West) 2
7 3 Window (North) 3
8 1 Door 4
8 2 Table #1 5
8 3 Table #2 6
7 4 Table #1 7
8 4 Chair #1 8
7 6 Table #2 9
7 5 Table #3 10
8 5 Chair #2 11
参见 ID #9 和 #10。Thair ItemID 已切换。ItemID 应该分别是 5 和 6,而不是 6 和 5,但第 10 次插入可能发生在 #9 的后插入触发器完成执行之前。
此问题发生在少于 0.5% 的插入中:2 次开关涉及 4 条记录,插入次数为 1000 次或更少。是的,有时没有开关发生。
一步提高隔离级别无济于事,甚至会导致更多的key/dependent-keys不时切换。提高两个隔离级别会导致死锁。
降低隔离级别会减少开关,但它们仍然会被创建。
在每次插入之前开始提高隔离级别并在触发器结束时移回默认隔离级别会导致死锁(在我的实验中,所有插入都没有提交!)。
有没有人看到出路?
如何强制插入及其后插入触发器一起执行,禁止其他插入到同一张表之间?