Как упомянуто в моем комментарии, у меня была точно та же проблема. Я решил его путем выполнения следующего:
sudo apt-get -f install
sudo shutdown -r now
Вы можете смешивать системы. параметры конфигурации транзакции и использование класса TransactionOption
, но есть некоторые вещи, о которых вам необходимо знать.
Если вы используете
TransactionOption
и укажите значениеТайм-аут
, это значение будет использоваться над system.transactions / defaultTimeout значение.
Я думаю, что вышесказанное является сутью проблемы в вашем случае. Вы используете TransactionOption
, чтобы указать уровень изоляции , и в качестве побочного эффекта вы получаете бесконечное значение тайм-аута, потому что бесконечное значение тайм-аута по умолчанию для TransactionOption
, если он не указан. Хотя я не совсем уверен, почему это так ... имеет смысл использовать по умолчанию время ожидания транзакции по умолчанию.
Вы можете реализовать свой собственный вспомогательный класс TransactionOptions, который включает значения по умолчанию, считываемые из app.config (если найдены ) или по умолчанию приемлемые значения для класса TransactionOption, который можно использовать.
В любом случае вы все равно можете ограничить это, используя значение system.transaction / machineSettings / maxTimeout . Это административный параметр, который можно настроить только через файл machine.config. Вы получите ConfigurationException, если попробуете его из app / web.config.
<system.transactions>
<machineSettings maxTimeout="00:00:30" />
</system.transactions>
С установленным maxTimeout , независимо от того, какое значение тайм-аута вы укажете, максимальное значение будет ограничено значением maxTimeout. По умолчанию maxTimeout составляет 00:10:00, или 10 минут, поэтому у вас никогда не будет бесконечного тайм-аута для транзакции.
Вы также можете явно установить транзакцию IsolationLevel в соединении с базой данных. вы используете в транзакции. Что-то вроде этого?
var connectionString = "Server=.;Database=master;Trusted_Connection=True;";
using (var scope = new TransactionScope(TransactionScopeOption.Required))
{
using (var conn = new SqlConnection(connectionString))
{
conn.Open();
var sqlTransaction = conn.BeginTransaction(System.Data.IsolationLevel.Serializable);
// do database work
//
sqlTransaction.Commit();
}
// do other work..
//
scope.Complete();
}
В ходе тестирования вам может потребоваться убедиться, что вы перестроили, чтобы повторно создать app.config. В моем тестировании выяснилось, что мне нужно завершить процесс * .vshost.exe, чтобы он подхватил систему. изменение настроек конфигурации транзакции - хотя я думаю, что это могло быть счастливой случайностью. Просто пожалуйста ..
Чтобы изложить мои текущие мысли:
Параметр файла конфигурации игнорируется при использовании TransactionOptions. Создание TransactionScope в большинстве случаев создает экземпляр CommittableTransaction. Конструктор без аргументов для CommittableTransaction будет использовать параметр файла конфигурации в качестве тайм-аута по умолчанию. Конструкторы TransactionScope, которые принимают TransactionOptions или TimeSpan, будут вызывать одну из перегрузок класса CommittableTransaction, а не версию без аргументов. Так что, если вы хотите использовать это значение, вы должны сами взять его из файла конфигурации.
Когда я столкнулся с этим, я поместил следующий код в небольшой класс TransactionOptionsFactory.
Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
ConfigurationSectionGroup sectionGroup = configuration.GetSectionGroup("system.transactions");
DefaultSettingsSection defaultSettings = (DefaultSettingsSection) sectionGroup.Sections["defaultSettings"];
TransactionOptions options = new TransactionOptions();
options.Timeout = defaultSettings.Timeout;
options.IsolationLevel = IsolationLevel.ReadCommitted;
Вы можете получить (подтвержденный) тайм-аут по умолчанию из конфигурации с помощью TransactionManager.DefaultTimeout
.
TransactionOptions
- это структура, которая инкапсулирует тайм-аут и уровень изоляции. При инициализации структуры с использованием конструктора по умолчанию он всегда будет инициализировать элементы структуры их значениями по умолчанию:
TransactionOptions transactionOptions = new TransactionOptions();
transactionOptions.Timeout == default(TimeSpan); // TimeSpan.Zero
transactionOptions.IsolationLevel == default(IsolationLevel); // IsolationLevel.Serializable
Если вы хотите указать IsolationLevel
и использовать тайм-аут по умолчанию:
new TransactionOptions()
{
IsolationLevel = IsolationLevel.Serializable, // Use whatever level you require
Timeout = TransactionManager.DefaultTimeout
};