Sql server 2008 如何以原子方式替换一组行?

Sql server 2008 如何以原子方式替换一组行?,sql-server-2008,transactions,Sql Server 2008,Transactions,我有一个从文件填充的产品表。更新文件时,我需要用新数据替换表中的所有行 执行此操作的简单方法是删除所有现有行,然后插入新行。然而,我担心的是,如果一个事务在插入的同时读取行,那么该事务可能最终从两个集合中读取行 那我该怎么阻止这一切呢?如果我使用可序列化事务,那么我认为在这种情况下可能会出现死锁。只有当两个事务各自至少使用两个资源(表/行)时才会出现死锁。在您的交易中是这样吗?此外,从表中删除所有行也是低效的。您可能需要检查是否可以使用TRUNCATE语句及其对事务的影响 @IanWarburt

我有一个从文件填充的产品表。更新文件时,我需要用新数据替换表中的所有行

执行此操作的简单方法是删除所有现有行,然后插入新行。然而,我担心的是,如果一个事务在插入的同时读取行,那么该事务可能最终从两个集合中读取行


那我该怎么阻止这一切呢?如果我使用可序列化事务,那么我认为在这种情况下可能会出现死锁。

只有当两个事务各自至少使用两个资源(表/行)时才会出现死锁。在您的交易中是这样吗?此外,从表中删除所有行也是低效的。您可能需要检查是否可以使用TRUNCATE语句及其对事务的影响

@IanWarburton,正如@steve建议的,您不想使用TRUNCATE语句,而是坚持删除语句!这里有一个可能适合您的解决方案。RDBMS通常有一些处理死锁的方法。在SQL server中,可以为会话设置死锁优先级。想法是为会话(主txn)设置高优先级,该会话通过读取您提到的文件删除现有行并插入新行。对于所有其他会话事务(其他TXN),设置低优先级,以便在出现死锁时使这些事务成为牺牲品。这使得要执行的主txn完成。您需要对主txn使用可序列化隔离级别。其他TXN收到死锁错误(1205),因此回滚其事务并重新启动它们

有关死锁检测和处理的更多信息,请参阅。

这个如何

using (var transaction = new TransactionScope())
{
   Context.Database.ExecuteSqlCommand("DELETE Items WITH (TABLOCKX)");

   SqlBulkCopyHelper.BulkInsert(Context.Database.Connection.ConnectionString, "Items", items);
}
其中“Context”是我从中获得的实体框架DbContext和SqlBulkCopyHelper


TransactionScope默认为SERIALIZABLE,因此我认为表锁将在整个期间保持。

我不担心效率低下。这是一次罕见的手术。什么是死锁只能发生在两个表上?有关死锁的信息,请参阅。该链接中没有关于死锁要求两个事务每个至少使用两个表的内容。使用truncate是错误的建议。Truncate是一个ddl语句,完成后将隐式提交。插入新行将是第二个事务。@steve,我已经收回了我的建议!谢谢