PetaPoco - 设置事务隔离级别

8
使用PetaPoco,您可以通过类似以下方式进行事务管理:
var newObject = new NewObject();
var newObjectId = 1;
using (var scope = db.GetTransaction())
{
    newObject = db.SingleOrDefault<NewObject>("SELECT * FROM tblNewObject WHERE Id = @0", newObjectId);
    scope.Complete();
}

虽然这对于在事务中处理更新提交非常有用,但它在控制事务的隔离级别方面有些欠缺,类似于传统的SQL连接方式:

TransactionOptions transOptions = new TransactionOptions() { IsolationLevel = IsolationLevel.ReadUncommitted };
using (new TransactionScope(TransactionScopeOption.Required, transOptions))
{
    //here be transactions
}

在PetaPoco中,GetTransaction返回一个新的事务,使用特定的构造函数调用BeginTransaction。在这种情况下,BeginTransaction使用.NET的IDbConnection.BeginTransaction()——它有一个重载以提供事务隔离级别。据我所知,PetaPoco没有提供任何方法来提供隔离级别给该方法。是否有人知道如何实际修改PetaPoco的隔离级别而不必深入源码并添加一个重载构造函数?我很高兴做这个工作并提交一个pull request,但在我开始工作之前,我想确保自己没有遗漏什么简单方法。
3个回答

3

使用最新版本的PetaPoco,现在可以设置隔离级别。

使用流畅配置

var db = config.Build()
         .UsingConnectionString("cs")
         .UsingProvider<SqlServerDatabaseProvider>()
         .UsingIsolationLevel(IsolationLevel.Chaos)
         .Create();

 db.IsolationLevel.ShouldBe(IsolationLevel.Chaos);

或传统构造函数。
var db = new Database("MyConnectionStringName") { IsolationLevel = IsolationLevel.Chaos };

3

看了一下PetaPoco的源代码,你说得完全正确。源代码中似乎没有任何内容允许你修改事务级别,我也没有找到任何在线文档支持这种行为。日后我会寻找你的拉取请求!那将非常有用!

不过,另一个选择是,在传递查询时明确设置事务隔离级别,你不觉得这也可以吗?

"SET TRANSACTION ISOLATION LEVEL READ COMMITTED SELECT * FROM tblNewObject WHERE Id = @0"

是的,我也考虑过这个解决办法,但我对此并不太满意。我打算提交一个拉取请求。 - antinescience
1
这是一个解决方法,但我认为没有提交拉取请求的话这是唯一可用的方法。因为没有什么是硬编码的。 - David L
2
同意。我会快速修改并提交一个PR。 - antinescience
我期待着它! - David L
这是它 - https://github.com/toptensoftware/PetaPoco/pull/172 - 看起来项目有点停滞,所以我不确定它是否会被采纳,但我在本地使用它,似乎很好。 - antinescience

0
或者在我的情况下,我希望避免锁定并且我不介意脏读,我会使用以下代码:
SELECT * FROM tblNewObject with(nolock) WHERE Id = @0

在PetaPoco术语中,仍然可以缩短为:

FROM tblNewObject with(nolock) WHERE Id = @0

这样做的好处是只选择和映射存在于您的 DTO 中的列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接