我的代码中有需要处理的事务:
using (var scope = new TransactionScope())
{
repo1.SaveSomething();
repo2.SaveAnythingElse();
scope.Complete();
}
在repo1和repo2内部,它们使用using创建自己的db context,并且在完成后释放它们,事务运行得很好。 现在我添加了另一段代码,却开始抛出异常: “底层提供程序无法打开(EntityFramework)已禁用分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具,在MSDTC的安全配置中启用DTC以进行网络访问。(System.Transactions)事务管理器已禁用其对远程/网络事务的支持。” 我发现当在同一个sql server数据库内的事务中打开连接时,它需要使用MSDTC组件来处理。所以我更改了代码如下:
using (var scope = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions() { IsolationLevel = IsolationLevel.ReadCommitted }))
{
....
scope.Complete();
}
现在异常已经消失了。
我的问题:
- 为什么之前代码中使用的事务从未丢弃异常?
- 为什么新代码会丢弃异常?
- 更改后为什么不再丢弃异常?
我认为这些问题很容易 :) 任何帮助将不胜感激!