PetaPoco – 设置事务隔离级别

使用PetaPoco,您可以进行事务管理,执行以下操作:

var newObject = new NewObject(); var newObjectId = 1; using (var scope = db.GetTransaction()) { newObject = db.SingleOrDefault("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的隔离级别而不必深入挖掘源并添加一个需要隔离级别的重载构造函数? 我很乐意这样做并提交拉取请求,但我想确保在我完成工作之前,我不会错过任何简单明了的事情。

快速浏览一下PetaPoco的源代码,看起来你是绝对正确的。 它看起来不像源中有任何东西允许您修改事务级别,也没有在线找到任何文档来支持该行为。 我将不得不寻找你的拉动请求! 这将非常有用!

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

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

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

使用流畅的配置

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

或传统的构造函数

 var db = new Database("MyConnectionStringName") { IsolationLevel = IsolationLevel.Chaos }; 

或者在我的情况下,我想避免锁定,而且我不会讨论脏读,我会使用:

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

根据PetaPoco的说法,它仍然可以缩短为:

 FROM tblNewObject with(nolock) WHERE Id = @0 

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