【发布时间】:2011-02-26 22:41:50
【问题描述】:
我正在为我的下一个新应用评估 EF。
如何全局更改应用程序中所有 EF 事务的 IsolationLevel? 例如:假设我想使用“Read Committed Snapshot”。
虽然当我明确需要 TransactionScope 时指定 IsolationLevel 是可以的(请参阅下面的代码),但必须将每个 EF 保存操作封装在 TransactionScope 中会很丑。
'OK
Using tsc As New TransactionScope(TransactionScopeOption.RequiresNew, TransactionOption.ReadCommitted)
UpdateShoppingCart
EnqueueNewOrder
SendConfirmationEmail
tsc.Complete
End Using
'Is this really the only way to avoid Serializable?
Using tsc As New TransactionScope(TransactionScopeOption.RequiresNew, TransactionOption.ReadCommitted)
_ctx.SaveChanges()
tsc.Complete
End Using
Class TransactionOption
Public Shared ReadOnly ReadCommitted As New TransactionOptions() With {
.IsolationLevel = IsolationLevel.ReadCommitted,
.Timeout = TransactionManager.DefaultTimeout
}
End Class
我认为混合 IsolationLevles 不是一个好主意。我错了吗?
使用 Serializable 和 SQL Server(与 Oracle 相比)插入看起来很简单的读取可能会导致转换锁死锁。
来自 EF 常见问题解答: “建议你使用 READ COMMITTED 事务,如果你需要 reader 不阻塞 writer 和 writer 不阻塞 reader,则使用 READ COMMITTED SNAPSHOT ISOLATION。”
我不明白为什么 EF 默认为 Serializable 并且很难更改默认隔离级别 - SQL Server(与 Oracle 的多版本控制相反)默认为悲观并发模型。配置选项应该很容易实现 - 还是我在这里遗漏了什么?
【问题讨论】:
-
您在哪里发现 EF 默认为 Serializable?
标签: .net entity-framework