TransactionScope и уровень изоляции

Ваша проблема связана с типом static, который требует новой инициализации каждый раз, когда цикл повторяется. Если вы находитесь в цикле, лучше сохранить конкретную инициализацию внутри цикла.

List<Object> objects = new ArrayList<>(); 

for (int i = 0; i < length_you_want; i++) {
    SomeStaticClass myStaticObject = new SomeStaticClass();
    myStaticObject.tag = i;
    // Do stuff with myStaticObject
    objects.add(myStaticClass);
}

Вместо:

List<Object> objects = new ArrayList<>(); 

SomeStaticClass myStaticObject = new SomeStaticClass();
for (int i = 0; i < length; i++) {
    myStaticObject.tag = i;
    // Do stuff with myStaticObject
    objects.add(myStaticClass);
    // This will duplicate the last item "length" times
}

Здесь tag является переменной в SomeStaticClass проверить правильность приведенного выше фрагмента; у вас может быть другая реализация, основанная на вашем случае использования.

14
задан Anton Kalcik 6 April 2009 в 17:58
поделиться

1 ответ

Я не думаю, что Ваша проблема имеет какое-либо отношение к понятию TransactionScope.NET. Скорее это кажется на описание ожидаемого поведения транзакций SQL Server. Кроме того, изменение уровня изоляции только влияет "на чтения данных" не "записи данных". От SQL Server BOL:

"Выбор уровня изоляции транзакции не влияет на блокировки, полученные для защиты модификаций данных. Транзакция всегда получает монопольную блокировку на любых данных, которые она изменяет и содержит ту блокировку, пока транзакция не завершается, независимо от набора уровня изоляции для той транзакции. Для операций чтения уровни изоляции транзакции, прежде всего, определяют уровень защиты от эффектов модификаций, сделанных другими транзакциями".

То, что это означает, - то, что можно предотвратить блокирующееся поведение путем изменения уровня изоляции для клиента, выходящего SELECT оператор (операторы). READ COMMITED уровень изоляции (значение по умолчанию) не предотвратит блокирование. Для предотвращения блокирования клиента Вы использовали бы READ UNCOMMITTED уровень изоляции, но необходимо было бы объяснить возможность, что записи могут быть получены, которые были обновлены/вставлены открытой транзакцией (т.е. они могли бы уйти, если транзакция откатывает).

19
ответ дан 1 December 2019 в 09:33
поделиться
Другие вопросы по тегам:

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