我已经读过ADO.NET的默认隔离级别(当没有使用事务时,即每个语句作为原子操作执行时)是'READ COMMITTED'和TransactionScope的默认隔离级别(http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx )是'SERIALIZABLE'。有这个原因吗?
我已阅读过很多关于此主题的网页,但我还没有找到我的具体问题的答案。
答案 0 :(得分:0)
交易是一个工作单元,这基本上意味着在范围内执行了几项活动。例如,预订购物车涉及检查产品,检查现有数量,计算运费和更新财务帐户。所有这些操作都应该是一个或全部,如果它们中的任何一个具有幻像读取,就像隔离级别'READ COMMITTED'那么它将数据置于陈旧状态。如果使用'SERIALIZED'范围,那么它将阻止在事务中对涉及的实体进行任何更新。
如果您正在查看一个月的财务报告,那么'READ COMMITTED'隔离级别有效,因为您正在查看现有数据而不进行太多修改,甚至幻像读取不会在报告中产生太大差异。
答案 1 :(得分:0)
原因是事务范围可以跨越多个(子)事务,这些事务都与分布式事务协调器(MS-DTC)协调。大多数情况下,您需要确保所有子转换都使用相同的数据,即使它们之间发生了提交。
例如,有三种方法的服务:checkbalance,increasebalance& decreasebalance。 每个方法都启动一个事务,打开数据库连接,执行SQL,关闭连接并提交事务。
典型的情况是该服务的客户将:
IsolationLevel.Serializable将确保所有服务调用将a)从相同数据开始并且b)在主事务运行时不允许任何其他人改变该数据。
IsolationLevel.ReadCommitted可以导致帐户1的余额低于零,如果其他人以足够的金额减少余额并在支票和减少之间提交该交易。