我们正在尝试建立一个大批量订单记录系统.有三个主要表:1.订单2. OrderDetails 3. OrderShipment
Shipment表包含每个订单的n条记录,并且在客户接受订单之前可以更改任何记录货件条目,之后它将被冻结.(业务要求)
虽然在现实世界的场景中可能不会发生这种情况......在我们的加载测试期间,我们得到了System.Data.Linq.ChangeConflictException异常.在交易中包含提交也无济于事.我们不能强制LINQ在整个更新操作期间锁定行吗?
有没有其他方法来克服这个?
如果您对同一数据的并发更新存在真正的问题,那么您可以考虑在事务中执行整个操作 - 即获取数据并提交数据.只要你将get/update/commit视为一个短暂的原子操作(即你不在中间暂停用户输入),它应该没问题.
特别是,对于可序列化的隔离级别,没有人可以更新您具有读锁定的数据(即您查询的任何内容).唯一的问题是,如果不同的查询以不同的顺序读取数据,这可能会导致死锁情况.AFAIK,没有办法让LINQ-to-SQL发出(UPDLOCK)提示,这是一种耻辱.
只要将TransactionScope或SqlTransaction设置为可序列化隔离(这是TransactionScope的默认设置),它就可以执行.