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 - 设置事务隔离级别的主要内容,如果未能解决你的问题,请参考以下文章