首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ADO.NET隔离级别v TransactionScope隔离级别

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

Stack Overflow用户
提问于 2013-07-26 15:04:20
回答 2查看 544关注 0票数 0

我读到过ADO.NET的默认隔离级别(不使用事务时,即每个语句都作为原子操作执行)是“read COMMITTED”,而TransactionScope (http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx)的默认隔离级别是“SERIALIZABLE”。这是有原因的吗?

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

EN

回答 2

Stack Overflow用户

发布于 2013-07-27 02:27:14

一个Transaction是一个工作单元,这基本上意味着在作用域中执行了几个活动。例如,Booking a Cart包括检查产品、检查现有量、计算运输成本和更新财务帐户。所有这些操作都应该作为一个或一个都不执行,如果它们中的任何一个都有幻影读取,就像隔离级别'READ COMMITTED'的情况一样,那么它就会将数据置于陈旧状态。如果使用'SERIALIZED'作用域,那么它将阻止在事务中涉及的实体的任何更新。

在这种情况下,如果您查看了一个月的财务报表,则“READ COMMITTED”隔离级别有效,因为您正在查看现有数据,并且没有进行太多修改,即使是幻影读取也不会在报表中产生太大差异。

票数 0
EN

Stack Overflow用户

发布于 2014-01-29 00:55:45

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

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

一个典型的场景是此服务的客户端执行以下操作:

  1. 开始主事务余额1
  2. 减少帐户余额1
  3. 增加帐户余额2
  4. 提交主事务

IsolationLevel.Serializable将确保所有服务调用将a)从相同的数据开始,以及b)在主事务运行时不允许其他人更改该数据。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17874968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档