TransactionScope是否支持原子数据库执行?

时间:2011-07-22 07:09:59

标签: c# sql-server transactionscope

我目前正在开发一个使用ADO实体框架在.Net中实现DAL的项目。

数据库结构并不简单,我希望能够确保某些数据库操作是原子的。

我知道您可以通过创建STORED PROCEDURE并使用数据库TRANSACTION(如this SO post中所述)来实现这一目标。 (我正在使用SQL Server)

问题是,我想尽可能地保持软件方面的逻辑,我正在考虑使用.Net TransactionScope。虽然我知道它从软件的角度来看效果很好(在提交整个范围之前没有任何内容提交给DB),但我怀疑它仍然可以确保数据库的原子执行。

有人知道吗?

更具体地说,通常代码如下所示:

using (TransactionScope scope = new TransactionScope())
{
  /*
   * Do some opreations such as reads, write, insert, deletes
   */
   scope.Commit()
}

我想确定的是,括号内的所有内容都是“原子地”完成的(隔离= SERIALIZABLE我猜)。我的意思是,我不希望DB的状态能够在范围内的代码执行时改变。

3 个答案:

答案 0 :(得分:2)

TransactionScope在事务中运行更新(也可能是读取,具体取决于您的事务隔离级别)

数据库提供程序已经成为此事务的一部分,因为它们在事务范围内使用 - 因此事务范围实际上是数据库事务(如果事务中涉及多个数据库/消息队列/等,则可能更多) )

编辑:实体框架详细信息

实体框架使用底层提供者的连接BeginTransaction方法。在SqlConnection的情况下,它使用SqlServer的默认值,因此将使用ReadCommitted

因此,如果您不使用事务范围,它将默认为Read Committed而不是Serializable

答案 1 :(得分:1)

“DB原子执行”是什么意思?有各种事务隔离级别。

与SQL Server交谈时,.NET TransactionScope会使用SQL Server事务,该事务默认为Serializable隔离级别。

答案 2 :(得分:1)

交易是始终原子,无论是在SQL中启动,在客户端中启动(例如,TransactionScope)