Тайм-аут транзакции по умолчанию

Как упомянуто в моем комментарии, у меня была точно та же проблема. Я решил его путем выполнения следующего:

  1. Начальная загрузка в режим восстановления.
  2. Вход в систему и хит CTRL + ALT + 1
  3. Тип sudo apt-get -f install
  4. Ожидает
  5. , Тип sudo shutdown -r now
  6. Ожидает
  7. Прибыль!
36
задан MattH 1 September 2009 в 09:56
поделиться

4 ответа

Вы можете смешивать системы. параметры конфигурации транзакции и использование класса 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, чтобы он подхватил систему. изменение настроек конфигурации транзакции - хотя я думаю, что это могло быть счастливой случайностью. Просто пожалуйста ..

46
ответ дан 27 November 2019 в 05:16
поделиться

Чтобы изложить мои текущие мысли:

  • Невозможно смешивать настройки конфигурации и использование TransactionOptions
  • . Единственный способ извлечь настройки конфигурации во время выполнения - это прочитать app.config как XML-файл
  • Уровень изоляции по умолчанию может быть выполнен только с помощью параметров транзакции или на уровне службы в WCF с использованием атрибутов
1
ответ дан 27 November 2019 в 05:16
поделиться

Параметр файла конфигурации игнорируется при использовании 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;
6
ответ дан 27 November 2019 в 05:16
поделиться

Вы можете получить (подтвержденный) тайм-аут по умолчанию из конфигурации с помощью 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
};
47
ответ дан 27 November 2019 в 05:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: