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返回一个新的 Transaction,它使用特定的构造函数调用BeginTransaction。在这种情况下,BeginTransaction 使用 .NET 的IDbConnection.BeginTransaction() - 它具有提供事务隔离级别的重载。据我所知,PetaPoco 没有提供任何方法来为该方法提供隔离级别。有谁知道是否可以实际修改 PetaPoco 的隔离级别,而不必深入研究源代码并添加一个采用隔离级别的重载构造函数?我很高兴这样做并提交一个拉取请求,但我想在我做这项工作之前确保我没有遗漏一些简单的东西。

4

3 回答 3

3

快速浏览了 PetaPoco 的源代码后,看起来您是完全正确的。看起来源代码中没有任何内容允许您修改事务级别,我也没有在网上找到任何支持该行为的文档。我将不得不在路上寻找你的拉动请求!这将非常有用!

但是,作为另一种选择,您是否可以不在您传递的查询中明确设置事务隔离级别?

"SET TRANSACTION ISOLATION LEVEL READ COMMITTED SELECT * FROM tblNewObject WHERE Id = @0"
于 2013-11-08T15:52:05.687 回答
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 };
于 2016-01-20T23:06:20.097 回答
0

或者在我的情况下,我想避免锁定并且我不关心脏读,我会使用:

SELECT * FROM tblNewObject with(nolock) WHERE Id = @0

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

FROM tblNewObject with(nolock) WHERE Id = @0

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

于 2015-06-29T00:10:32.667 回答