使用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的隔离级别而不必深入挖掘源并添加一个需要隔离级别的重载构造函数?我很乐意这样做并提交拉取请求,但我想确保在我完成工作之前,我不会错过任何简单明了的事情。
答案 0 :(得分:3)
快速浏览一下PetaPoco的源代码,看起来你是绝对正确的。看起来源中没有任何东西允许您修改事务级别,也没有在线找到任何文档来支持该行为。我将不得不寻找你的拉动请求!这将非常有用!
但是,作为另一种选择,您是否可以在传递的查询中明确设置事务隔离级别?
"SET TRANSACTION ISOLATION LEVEL READ COMMITTED SELECT * FROM tblNewObject WHERE Id = @0"
答案 1 :(得分:2)
使用最新版本的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 };
答案 2 :(得分:0)
或者在我的情况下,我想避免锁定,而且我不会讨论脏读,我会使用:
function checkError(console) {
if(console.error === "TimeEvent.COMPLETE") {
alert("The error is present");
}
}
,以PetaPoco术语,仍然可以缩短为:
SELECT * FROM tblNewObject with(nolock) WHERE Id = @0
这样做的好处是只选择和映射DTO中存在的列。