0

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

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

4

2 回答 2

0

事务是一个工作单元,这基本上意味着在该范围内执行了多个活动。例如,预订购物车涉及检查产品、检查现有数量、计算运输成本和更新财务账户。所有这些操作都应该是一个或没有,如果其中任何一个有幻读,就像在隔离级别“READ COMMITTED”的情况下一样,那么它将数据置于陈旧状态。如果使用“SERIALIZED”范围,那么它将阻止对事务中涉及的实体进行任何更新。

在某个情况下,您正在查看一个月的财务报告,然后“READ COMMITTED”隔离级别起作用,因为您正在查看现有数据并且没有进行太多修改,即使幻读也不会在报告中产生太大差异.

于 2013-07-26T18:27:14.117 回答
0

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

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

一个典型的场景是这个服务的客户:

  1. 启动主事务
  2. 查看账户 1 的余额
  3. 减少账户 1 的余额
  4. 增加账户2的余额
  5. 提交主事务

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

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

于 2014-01-28T16:55:45.463 回答