2010-09-02 3 views
0

У меня вопрос. Представьте, что у вас есть объект, который вы хотите сохранить в транзакции, объект, имеющий коллекции других объектов и т. Д., Поэтому его более «сложный» объект.Уровень транзакции Nhibernate во время сохранения помощи

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

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

Поскольку все мы знаем, что данные клиентов все время сохраняются, это просто то, что иногда оно не маркируется вместе, когда оно отправляется нам.

Так что мы хотели бы, чтобы какой-то замок, я полагаю, я просто ничего не знаю об этих замках. Какой из них мы должны использовать?

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

Любая помощь будет оценена!

С наилучшими пожеланиями, Е.

ответ

1

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

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

using (var transactionScope = new TransactionScope(TransactionScopeOption.Required, 
    new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted })) 
{ 
    // Read the data you want from the database. 
    ... 
    transactionScope.Complete(); 
    // Return the data. 
} 

Использование TransactionScope с IsolationLevel.ReadCommitted предотвращает считывание данных, которые еще не были совершенны другой сделкой.

Код, который записывает данные в базу данных, также должен быть помещен внутри одной транзакции. Пока вы только записываете данные внутри этой транзакции, уровень изоляции для этой транзакции не имеет значения. Это гарантирует атомарность ваших обновлений: либо все обновления будут успешными, либо ни один из них. Это также препятствует чтению частичного обновления другой транзакции.

+0

Спасибо большое! Именно то, что мне нужно было знать. :) – Einarsson

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