PetaPoco - 设置事务隔离级别

Posted

技术标签:

【中文标题】PetaPoco - 设置事务隔离级别【英文标题】:PetaPoco - setting transaction isolation level 【发布时间】:2013-11-20 16:20:23 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

是的,我认为这是一种解决方法,但我真的不太高兴。即将提交拉取请求。 这是一种解决方法,但它是我认为没有拉取请求的唯一可用方法。没有什么硬的东西。 同意。我正在快速修改它并提出 PR。 期待! 这里是 - github.com/toptensoftware/PetaPoco/pull/172 - 看起来项目有点停滞,所以我不确定它是否会成功,但我在本地使用它,它似乎没事。【参考方案2】:

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

使用fluent configuration

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】:

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

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

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

FROM tblNewObject with(nolock) WHERE Id = @0

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

【讨论】:

以上是关于PetaPoco - 设置事务隔离级别的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL 事务隔离级别

事务-并发事务演示及隔离级别

按请求变量事务隔离级别

查询修改mysql事务隔离级别

Hibernate中事务的隔离级别设置

修改事务隔离级别的暗门