LINQ更新失败后会发生什么?

时间:2010-02-26 20:27:45

标签: linq transactions

以下是该方案:

  • 进程1(P1) - 读取各种平面文件,其中一个结果是删除或添加照片URL到数据库表以指示这些需要下载
  • 流程2(P2) - 查找需要下载的照片网址,实际执行下载,然后将记录标记为已下载

P1和P2有时会根据要处理的数据量同时运行,有时P1会删除P2已经加载并准备下载的记录。

这实际上不是问题 - 如果图像被下载但不再需要,这些图像URL的性质可能最终在以后的日期被使用,并且空间无关紧要。因此,唯一的麻烦是,如果P2选择一组记录,然后在LINQ更新期间其中一些记录不再存在,则SubmitChanges()会抛出一个错误,类似于:

  

“4次更新中的1次失败。”

我的问题是:此更新失败后发生了什么?据我所知,有3种可能性:

  1. 整个交易已回滚
  2. 事务未回滚,所有可以更新的记录都是
  3. 事务未回滚且第一条记录已更新,但第二条记录失败,因此未尝试其余更新。
  4. 实际调用如下 - 没有设置ConflictMode:

    this.SomeDataContext.SubmitChanges();
    

    如何更改此调用,以便可以执行的任何更新和其他更新都被忽略?以下是否有效:

    this.SomeDataContext.SubmitChanges(ConflictMode.ContinueOnConflict);
    

    我没有在MSDN中看到任何指示无参数调用的默认ConflictMode:

    http://msdn.microsoft.com/en-us/library/bb292162.aspx

    ..虽然单个参数调用中有一个指示,表明默认值为FailOnFirstConflict:

    http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.submitchanges.aspx

2 个答案:

答案 0 :(得分:2)

使用Linq-To-SQL,调用SubmitChanges()时提交的所有更改都将作为单个事务保存或回滚。因此,如果在调用SubmitChanges()时有2个插入,2个更新和2个删除,则它们将作为单个工作单元保存或回滚。

通过在TransactionScope对象中包装所有SubmitChanges()调用,可以进行许多SubmitChanges()调用并将所有SubmitChanges()中的所有插入/更新/删除视为单个工作单元。

答案 1 :(得分:0)

我会评论,但没有足够的声誉。

我在这里寻找对使用的默认ConflictMode的答案。后来我找到了http://msdn.microsoft.com/en-us/library/bb345081(v=vs.90).aspx

现在似乎记录了它。