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

时间:2013-07-26 07:04:20

标签: .net transactions

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

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

2 个答案:

答案 0 :(得分:0)

交易是一个工作单元,这基本上意味着在范围内执行了几项活动。例如,预订购物车涉及检查产品,检查现有数量,计算运费和更新财务帐户。所有这些操作都应该是一个或全部,如果它们中的任何一个具有幻像读取,就像隔离级别'READ COMMITTED'那么它将数据置于陈旧状态。如果使用'SERIALIZED'范围,那么它将阻止在事务中对涉及的实体进行任何更新。

如果您正在查看一个月的财务报告,那么'READ COMMITTED'隔离级别有效,因为您正在查看现有数据而不进行太多修改,甚至幻像读取不会在报告中产生太大差异。

答案 1 :(得分:0)

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

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

典型的情况是该服务的客户将:

  1. 启动主交易
  2. 检查帐户1的余额
  3. 减少帐户1的余额
  4. 增加帐户2的余额
  5. 提交主交易
  6. IsolationLevel.Serializable将确保所有服务调用将a)从相同数据开始并且b)在主事务运行时不允许任何其他人改变该数据。

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