使用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返回一个新事务,该事务使用该特定构造函数调用BeginTransaction。在这种情况下,BeginTransaction使用.NET的IDbConnection.BeginTransaction() -它具有重载以提供事务隔离级别。据我所知,PetaPoco没有为该方法提供任何隔离级别。是否有人知道是否有可能修改PetaPoco的隔离级别,而不必深入源代码并添加一个重载的构造函数来接受隔离级别?我很乐意这样做,并提交一个拉请求,但我想确定在我做工作之前,我没有遗漏一些直接的东西。
发布于 2013-11-08 15:52:05
快速查看了PetaPoco的源代码后,看起来您是绝对正确的。在源代码中似乎没有允许您修改事务级别的任何内容,我也没有在网上找到任何支持该行为的文档。我得在路上找你的拉力请求!这会很有用的!
但是,作为另一种选择,您可以在传递的查询中显式地设置事务隔离级别吗?
"SET TRANSACTION ISOLATION LEVEL READ COMMITTED SELECT * FROM tblNewObject WHERE Id = @0"发布于 2016-01-20 23:06:20
使用最新版本的PetaPoco,现在可以设置隔离级别。
使用fluent配置
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 };发布于 2015-06-29 00:10:32
或者在我的例子中,如果我想避免锁定,而且我不太在意脏读,我会使用:
SELECT * FROM tblNewObject with(nolock) WHERE Id = @0在PetaPoco术语中,仍然可以将其缩短为:
FROM tblNewObject with(nolock) WHERE Id = @0这样做的好处是只选择和映射DTO中存在的列。
https://stackoverflow.com/questions/19862748
复制相似问题