下面的代码(只是一个用于显示问题症结的精简示例。实际代码执行的更多)将在运行Powershell版本2的机器上抛出错误。
using (new TransactionScope(TransactionScopeOption.Required))
{
using (var powershell = PowerShell.Create())
{
powershell.AddScript("");
powershell.Invoke();
}
}
抛出的错误是:
System.InvalidOperationException:在TransactionScope内部已更改Transaction.Current。
在创建powershell实例的using语句退出后,'Transaction.Current'变为空(如果您的机器具有PowerShell版本2,则Transaction.Current仍保留其事务)。通过在抑制的TransactionScope中使用statement包装powershell,我已经能够阻止它抛出异常:
using (new TransactionScope(TransactionScopeOption.Required))
{
using (new TransactionScope(TransactionScopeOption.Suppress))
{
using (var powershell = PowerShell.Create())
{
powershell.AddScript("");
powershell.Invoke();
}
}
}
但我希望运行的任何powershell脚本都是事务的一部分,而不是非事务性的,所以上面不是一个理想的解决方案。
还有其他想法吗?