我读到过ADO.NET的默认隔离级别(不使用事务时,即每个语句都作为原子操作执行)是“read COMMITTED”,而TransactionScope (http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx)的默认隔离级别是“SERIALIZABLE”。这是有原因的吗?
我已经阅读了很多关于这个主题的网页,但我还没有找到我的具体问题的答案。
发布于 2013-07-27 02:27:14
一个Transaction是一个工作单元,这基本上意味着在作用域中执行了几个活动。例如,Booking a Cart包括检查产品、检查现有量、计算运输成本和更新财务帐户。所有这些操作都应该作为一个或一个都不执行,如果它们中的任何一个都有幻影读取,就像隔离级别'READ COMMITTED'的情况一样,那么它就会将数据置于陈旧状态。如果使用'SERIALIZED'作用域,那么它将阻止在事务中涉及的实体的任何更新。
在这种情况下,如果您查看了一个月的财务报表,则“READ COMMITTED”隔离级别有效,因为您正在查看现有数据,并且没有进行太多修改,即使是幻影读取也不会在报表中产生太大差异。
发布于 2014-01-29 00:55:45
原因是一个事务作用域可以跨越多个(子)事务,所有这些事务都通过分布式事务协调器(MS-DTC)进行协调。大多数情况下,您需要确保所有子超越都使用相同的数据,即使它们之间发生了提交。
例如,一个服务有3个方法: checkbalance、increasebalance和decreasebalance。每个方法启动一个事务,打开一个数据库连接,执行一个SQL,关闭连接并提交事务。
一个典型的场景是此服务的客户端执行以下操作:
IsolationLevel.Serializable将确保所有服务调用将a)从相同的数据开始,以及b)在主事务运行时不允许其他人更改该数据。
如果其他人以足够的金额减少了帐户1的余额,并在支票和减少之间提交了该事务,则IsolationLevel.ReadCommitted会导致帐户1的余额低于零。
https://stackoverflow.com/questions/17874968
复制相似问题