我在我的应用程序中遇到了需要使用表锁定提示或将事务隔离级别设置为默认读取已提交以外的其他情况,以解决死锁问题。我正在使用面向服务的架构,每个服务调用都作为原子操作运行,Linq To Sql 用作轻量级 DAL。每个服务调用都会调用我的业务层并声明一个新事务,如下所示:
using (var scope = new TransactionScope())
{
// Get datacontext
// do Business Logic stuff, including database operations via Linq To Sql
// Save transaction
scope.Complete();
}
问题是有时我有复杂的业务逻辑,需要许多数据库操作。一些读取、一些写入、一些用于更新的读取等,都在同一个服务调用中,因此是同一个事务。
我已阅读有关 Linq To Sql 无法向您的 linq 查询添加表锁定提示的信息,建议使用 TransactionScope 隔离级别的解决方案。这很好,但在我的情况下,每个事务都是为了原子服务调用的目的,我看不出这会在哪里起作用。例如,如果我需要在没有锁定的情况下读取一个表,并且脏读可能没问题,然后转身再做一次读取以进行更新,然后进行更新。我不想为整个事务设置未提交的读取,只设置一个特定的读取,那我该怎么办?
有没有我可以实现的扩展,允许我添加表锁定提示,而不使用视图或存储过程,或者使用 datacontext.ExecuteQuery("my raw sql string here")