[英]Using SqlBulkCopy in one transaction for multiple, related tables
我试图将三个相关表中的大量数据(总共一百万条记录)复制到同一数据库中的其他三个相关表中,这有点困难。
我的表设计如下:
我需要的是能够将草稿表中的数据复制到一个事务中的非草稿表中,如果出现任何问题我可以回滚。 这是必需的,因为如果BillingPriceLineSpecificationDraft
复制的批量插入失败,我们不希望Billing
和BillingPriceLine
记录存在于数据库中。
但是,由于我使用SqlBulkCopy
来复制记录,因此我无法获得新ID以在三个新表之间建立正确的关系。 如果我执行读取,即事务中的Billing
表以获取正确的Billing
ID,我会得到一个超时,这是预期的,因为表在事务中被锁定。
我已经尝试在事务上设置IsolationLevel
枚举(事实上,我疯了,并尝试了所有;-)),但他们似乎没有做任何事情。
有没有什么好办法让我失踪?
提前致谢。
你不能真正使用批量复制。
您也不需要 - 使用SqlBulkCopy触摸真实表是一种非常糟糕的做法,因为无论谁编写该内容,都不了解SQL Server锁定机制。
结果是两全其美的。 一旦你有了临时表中的数据(可能是伪造的ID),你就可以在一个事务中提取一些非常有趣的SQL来更新源表,并为下一个表提供相关的内部ID。 SQL变得复杂,但这是你能做的最好的。
解释为什么SqlBulkCopy是坏的:
SqlBulkCopy确实存在很大问题 - 它确实是螺旋锁定。 它需要一个独占的表锁(这是“好的”)。 它要求它 - 但它永远不会等待(即如果表上有任何锁定,这会失败),然后再次尝试....一段时间后......直到超时到期。 结果是在具有活动的表上,很难让SqlBulkCopy获得任何锁定。 正确的代码是等待独占锁......好吧。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.