ADO.NET隔离级别v TransactionScope隔离级别

ADO.NET隔离级别v TransactionScope隔离级别,.net,transactions,.net,Transactions,我已经了解到ADO.NET的默认隔离级别(当不使用事务时,即每个语句作为原子操作执行时)为“读取提交”,TransactionScope()的默认隔离级别为“可序列化”。这有什么原因吗 我已经阅读了很多关于这一主题的网页,但我还没有找到我的具体问题的答案。A事务是一个工作单元,基本上意味着在该范围内执行了多个活动。例如,预订购物车包括检查产品、检查现有数量、计算运费和更新财务账目。所有这些操作都应该是“一”或“无”,如果其中任何一个操作的幻影读取方式与隔离级别“读取已提交”类似,则会将数据置于陈

我已经了解到ADO.NET的默认隔离级别(当不使用事务时,即每个语句作为原子操作执行时)为“读取提交”,TransactionScope()的默认隔离级别为“可序列化”。这有什么原因吗


我已经阅读了很多关于这一主题的网页,但我还没有找到我的具体问题的答案。

A事务是一个工作单元,基本上意味着在该范围内执行了多个活动。例如,预订购物车包括检查产品、检查现有数量、计算运费和更新财务账目。所有这些操作都应该是“一”或“无”,如果其中任何一个操作的幻影读取方式与隔离级别“读取已提交”类似,则会将数据置于陈旧状态。如果使用了“序列化”作用域,则它将阻止在事务中对涉及的实体进行任何更新


在这种情况下,如果您查看了一个月的财务报告,那么“读取已提交”
隔离级别起作用,因为您查看的是现有数据,没有进行太多修改,即使是幻影读取也不会在报告中产生太大的差异

原因是一个事务作用域可以跨越多个(子)事务,这些事务都与分布式事务协调器(MS-DTC)协调。大多数情况下,您需要确保所有子转换都使用相同的数据,即使它们之间发生了提交

例如,有3种方法的服务:checkbalance、increasebalance和decreasebalance。 每个方法都启动一个事务、打开数据库连接、执行SQL、关闭连接并提交事务

典型的情况是,此服务的客户端将:

  • 启动主事务
  • 检查账户1的余额
  • 减少账户1的余额
  • 增加账户2的余额
  • 提交主事务
  • IsolationLevel.Serializable将确保所有服务调用a)从相同的数据开始,b)在主事务运行时,不允许任何其他人更改该数据


    IsolationLevel.ReadCommitted可能会导致帐户1的余额低于零,如果其他人以足够的金额减少余额,并在支票和减少之间提交该交易。

    谢谢,但我不相信这能回答我的问题。我理解这两种隔离类型之间的区别。我不明白为什么TransactionScope在默认情况下与SQL Server具有不同的隔离级别。嗯,任何RDBMS解决方案在默认情况下都支持ACID属性。默认情况下,如果没有事务范围,它将被读取并提交。我希望我回答了你的问题。你知道隔离级别可以用transactionscope序列化的原因吗?我怀疑这只是transactionscope开发人员做出的设计决策。想想看,任何设计都基于您可能知道的用例。在单个事务中,如果您需要控制,那么对单个表进行读提交是可行的,但是如果您需要支持更新多个表并确保它满足ACID属性,该怎么办呢。然后您需要TransactionScope。这只是隔离级别的另一个名称,因为您无法在同一隔离级别中完成所有操作。再次感谢。您是说如果要更新多个表,您应该始终使用可序列化的隔离级别吗?