【发布时间】:2011-07-22 16:22:15
【问题描述】:
我目前正在开发一个使用 ADO 实体框架在 .Net 中实现 DAL 的项目。
数据库结构并不简单,我希望能够确保某些数据库操作是原子的。
我知道您可以通过创建 STORED PROCEDURE 并使用 DB TRANSACTION(如 this SO post 中所述)来做到这一点。 (我使用的是 SQL Server)
问题是,我想尽可能地保留软件方面的逻辑,我正在考虑使用 .Net TransactionScope。虽然我知道从软件的角度来看它运行良好(在提交整个作用域之前不会向数据库提交任何内容),但我怀疑它是否仍能确保数据库原子执行。
有人知道吗?
更具体地说,通常代码如下所示:
using (TransactionScope scope = new TransactionScope())
{
/*
* Do some opreations such as reads, write, insert, deletes
*/
scope.Commit()
}
我想确定的是,括号内的所有内容都是“原子”完成的(我猜是isolation=SERIALIZABLE)。我的意思是,当范围内的代码正在执行时,我不希望数据库的状态能够改变。
【问题讨论】:
-
ACID 关系数据库中的“原子”单元是一个事务。为任务选择正确的isolation level 并适当地提交/回滚——尽管这对数据之外的关键区域没有帮助(它与 RDBMS 事务严格相关!)。使用
TransactionScope是通过隐式线程本地事务帮助处理此类事务的一种方法(无需显式传递它)。 -
@Mitch:谢谢。您是否认为使用 ADO 实体框架完成的任何事情都是如此。
-
@SRKX :不检查,我不能 100% 确定。实体框架可能会根据正在执行的操作更改默认隔离级别。
-
我刚刚用实体框架详细信息更新了我的答案
标签: c# sql-server transactionscope