2015-07-29 5 views
0

Привет У меня проблема с транзакциями NHibernate.nhibernate несколько транзакций и недостатки

Я должен сделать обновления несколько раз, но когда я использую:

using (var trans = session.BeginTransaction()) 
{ 
     ..... 
     trans.commit(); 
} 

Коммит берет меня очень много времени, около 1 минуты или что-то (это не приемлемо в моем случае)

Поэтому я использую несколько транзакций в одном обновлении и у меня есть что-то вроде этого:

using (var trans1 = session.BeginTransaction()) 
{ 
     ..... 
     trans1.commit(); 
} 
using (var trans1 = session.BeginTransaction()) 
{ 
     ..... 
     trans1.commit(); 
} 
using (var trans1 = session.BeginTransaction()) 
{ 
     ..... 
     trans1.commit(); 
} 
... 

и единственная фиксация занимает около одной секунды или менее (это приемлемое время для меня)

Итак, мой вопрос в том, есть ли такие преимущества/недостатки этого подхода? я мог бы упомянуть только, что: одной транзакции:

Преимущества:

  1. меньше времени на 'создание' транзакции

Недостатки:

  1. очень длинный замок на дб, из-за долго совершают

Multiple Transaction

Преимущества

  1. Очень короткие замки на дб, из-за быстро совершает

Недостатки

  1. гораздо больше времени тратить на «создание» сделки

Для меня более важно время расходы на «блокировки дб», чем создание транзакций. Итак, есть ли какие-либо другие преимущества этого подхода? Или есть другие подходы, которые лучше?

ответ

0

Я хотел бы предложить меньше времени и больше о ACID ... и, более конкретно, эти обновления являются логическими «целыми»? Это должно быть ключом к детализации транзакций.

Другой способ решить, что произойдет, если произойдет одно из обновлений? Похоже, вы не хотят все обновления откатить, поэтому разделив их прекрасно (возможно, поэтому parallelable и, таким образом, была бы гораздо быстрее?)

+0

Ther есть, и они не находятся в какой-то точке зрения. Поскольку записи связаны друг с другом по id, но этот идентификатор I возвращает в каждой транзакции и передается в следующем. Поэтому я могу сказать, что одно обновление не коррелирует с другими обновлениями. Я не могу использовать parrallel, потому что я должен поддерживать правильный порядок обновлений. Откат - это «другая чашка чая» в моем случае. – MNie

+0

@Tadek, если одна из ваших транзакций завершилась неудачей, вам нужно отменить другие транзакции? –

+0

Нет, мне это не нужно. – MNie

0

Не зная детали вашего приложения: Ведение нескольких транзакций для связанного Корневые агрегаты кажутся прекрасными.

Другими словами, если обновления находятся на разных элементах, вы можете рассмотреть возможность их размещения в каком-то репозитории.Update (newItem).

CurrentItem ci = repository.get(id) 
ci.dataUpdate(newInput) 
Repository.Update(ci) 
+0

Мой вопрос - это скорее общий вопрос о том, что выбрать в какой ситуации, а также, если это хорошая идея использовать несколько транзакций. – MNie

+0

Hi @Tadek да, я вижу. Мне было бы любопытно, какие сгенерированы выражения sql, которые займут всю минуту, поскольку это, по-видимому, указывает на некоторые причины. – Hace

+0

Длинные блокировки на БД не будут приемлемы для интерфейсов графического интерфейса, поскольку пользователи сайта будут делать такой сайт непригодным для использования – Hace

Смежные вопросы