7

我们正在尝试建立一个大批量订单记录系统。有三个主表: 1. Orders 2. OrderDetails 3. OrderShipment

Shipment 表包含每个订单的 n 条记录,并且在客户接受订单之前可以更改任何记录的发货条目,之后订单将被冻结。(业务需求)

尽管这在现实世界的场景中可能不会发生……在我们的负载测试期间,我们得到了 System.Data.Linq.ChangeConflictException 异常。在事务中结束提交也无济于事。我们不能强制 LINQ 在整个更新操作期间锁定行吗?

有没有其他方法可以克服这个问题?

4

3 回答 3

7

如果您对同一数据的并发更新确实存在问题,那么您可能会考虑在事务中执行整个操作 - 即获取数据提交它。只要您将获取/更新/提交视为短暂的原子操作(即您不会在中间暂停用户输入),就应该没问题。

特别是,使用可序列化的隔离级别,没有人可以更新您有读锁的数据(即您查询的任何内容)。唯一的问题是,如果不同的查询以不同的顺序读取数据,这可能会导致死锁情况。AFAIK,没有办法让 LINQ-to-SQL 发出(UPDLOCK)提示,这是一种耻辱。

TransactionScope 或 SqlTransaction 都可以,只要将它们设置为可序列化隔离(这是 TransactionScope 的默认设置)。

于 2008-10-10T10:07:36.053 回答
1

您可能想查看将所有内容作为事务执行的实体框架。这里有两个关于 Entity Framework 的播客也很有趣。

DNRTV -一部分 1 - 一部分 2

于 2008-10-10T10:08:00.733 回答
1

对于这种情况,即多个用户可能想要对同一记录/客户/订单/任何内容进行更改,最好在应用程序逻辑中构建“锁定”而不是使用数据库锁定。

使用 DB 锁来解决数据的逻辑锁定会给您带来一堆新问题。更好的解决方案是有列和/或表,您可以在其中指示订单/客户/等正在[由用户]编辑,直到它被锁定等。查询该表(或列)以检查客户是否/order/thing 在允许其他用户编辑之前可用于编辑。

请参阅: http ://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=3984968&SiteID=1

于 2008-10-13T06:36:32.893 回答