【问题标题】:Linq version of SELECT FOR UPDATESELECT FOR UPDATE 的 Linq 版本
【发布时间】:2009-12-04 17:50:42
【问题描述】:

当代码更新某个表中的某个行时,我在我的 Web 应用程序中得到一个 ChangeConflictException。我能说的最好的情况似乎是两个用户同时完成了事务,而乐观并发只影响SubmitChanges() 方法,而不是在选择行时执行锁定。

所以换句话说,我有这样的交易:

Dim query = From row in Table _
            Where row.ID = <blah> _
            Select row
Dim result = query.Single()
result.COLUMN = 2
dataContext.SubmitChanges()

当调用SubmitChanges() 时,内置的乐观并发会锁定记录,但如果在Single()SubmitChanges() 之前更改记录,则会引发错误。

...至少这是我的理论...

有谁知道在Single() 调用而不是在SubmitChanges() 开始锁定的方法?

【问题讨论】:

  • 根据我的理解,SubmitChanges() 似乎有内置的事务处理。所以可能有一个解决方案可以改变内置事务的处理方式。例如:DataContext.ExecuteCommand("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE") 或类似的东西。

标签: asp.net linq concurrency


【解决方案1】:

有一些方法可以使用 Linq to SQL 进行事务处理——但我还没有做到。

我同意处理解决并发问题(提示用户)的问题也可能比使用事务更好,但是,有几个链接可能会有所帮助:

LINQ to SQLTransactions (LINQ to SQL) (Microsoft)

还有一段短片:

http://www.microsoft.com/uk/msdn/nuggets/nugget/206/Transactions-in-LINQ-to-SQL.aspx

【讨论】:

    【解决方案2】:

    不,您必须将事务包装在 try/catch 块中,并处理引发的异常。 Linq to SQL 提供了大量信息,使您能够以智能的方式处理异常。见http://elsharpo.blogspot.com/2008/04/handling-concurrency-conflicts-in-linq.html

    【讨论】:

      【解决方案3】:

      最简单的方法是使用 DataContext.ExecuteCommand 并发送您自己的更新语句。

      【讨论】:

        猜你喜欢
        • 2011-06-28
        • 1970-01-01
        • 1970-01-01
        • 2013-09-23
        • 2017-12-15
        • 2017-12-05
        • 2014-03-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多