.net - 始终在 DAL 基类中使用 TransactionScope 是一个好习惯吗?

标签 .net sql-server architecture transactions

我有一个 DAL 基类,它集中了我的应用程序中的所有数据库调用代码。我想确保所有插入/更新/删除操作都包含在事务中,无论它是否写入 SP。将我的“ExecuteNonQuery”DAL 方法包装在 TransactionScope 中是否是一个好习惯,或者我是否会为不需要它的数据库调用添加大量开销。

当需要包装多个服务调用时,我很高兴在 UI 中使用 TransactionScope ,它实际上只是在 SP 级别强制执行,我不确定。

我使用 .net 3.5,主要使用 SQLServer 2008,一些客户仍在使用 2005 - 希望尽快将其转移。

谢谢

最佳答案

Tsansactions(尤其是诸如 TransactionScope 之类的重量级操作,即使使用 LTM)主要在应用多个操作时启动,这些操作可能跨越多个数据库调用。

添加事务可能很重要,但它改变了查询的性质;您可以引入最明显的死锁,但您也可以更改错误方法的预期副作用。它还可以修复一个意外的副作用。它改变了锁定配置文件,并且具有不同的系统要求(启用 DTC 是最明显的)。

所以不要闲着添加它们。

同样,许多只读 View 屏幕不需要任何特殊的锁定;哎呀,如果您看到正在进行的带有幻像/脏/不可重复/等数据的事务,大多数列表/搜索/等不会以任何重要方式发生变化。

就个人而言,当我使用基于 SP 的代码时,我并不倾向于将事务管理放在 SP 中 - 将其提升到具有更复杂的故障管理的更高级别 - 即除了 TSQL 之外的几乎所有内容,TSQL 并不打算擅长像这样的程序管道代码。显然,它擅长基于集合的 DML。

关于.net - 始终在 DAL 基类中使用 TransactionScope 是一个好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6151986/

相关文章:

.net - 是否使用 Word/Office 进行版本控制,但使用专有文档存储库(即不是 Sharepoint),以满足某种提供程序模型的需求?

.net - 为什么我在 IDisposable 类中获得带有私有(private)成员 IDisposable 的 CA2000?

sql-server - Linux 上的 MS SQL Server : set password using script

javascript - 使用手动硬编码模板/组件的可视化构建器

architecture - 我可以从表示层访问存储库吗?

.net - 连接字符串中的应用程序与应用程序名称

c# - 如何确定方法是否以解耦方式在 UI 线程上执行?

mysql - neo4j 在哪里保存它的数据?

sql - SQL Server 2008 中的 COUNT (DISTINCT column_name) 与 COUNT (column_name) 之间存在差异吗?

python - 如何使用三个使用公共(public)模块的应用程序构建一个 python 项目