【问题标题】:Does TransactionScope support atomic DB execution?TransactionScope 是否支持原子数据库执行?
【发布时间】: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


【解决方案1】:

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

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

编辑:实体框架详细信息

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

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

【讨论】:

  • 好的,您认为TransactionScope 中应该包含什么内容?你认为模型的实例应该在范围内创建还是只有SaveChanges()方法很重要?
  • 在 TransactionScope 中创建模型(我假设您的意思是 ObjectContext 包装器)
【解决方案2】:

“数据库原子执行”是什么意思?有多种事务隔离级别。

在与 SQL Server 通信时,.NET TransactionScope 登记一个 SQL Server 事务,默认情况下将是 Serializable 隔离级别。

【讨论】:

  • TransactionScope 默认使用 Serializable
  • 你说得对,SQL Server 默认使用 READ COMMITTED 来处理它的事务——不知道为什么他们为 TxScope 选择了不同的东西——对于那些不习惯事务的人来说,这可能至少会让他们感到惊讶
  • 我今天学到了一些东西! TransactionScope 没有像你想象的那样工作!
  • 所以基本上,默认情况下,从创建TransactionScopeCommit() 调用发生的所有事情都将被数据库视为单个操作?包括(可能)读表、数据处理等?
  • @SRKK:是的,只要连接在事务中登记即可。
【解决方案3】:

事务是始终原子的,无论是在 SQL 中启动,还是在客户端(例如 TransactionScope)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 2010-09-07
    • 2016-11-10
    相关资源
    最近更新 更多