Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Длинная транзакция в ADO.Net


Автор: frozer 18.3.2008, 16:18
Как в приложении с одним постоянно открытым соединением к базе (Firebird) сделать "длинную" транзакцию, во время которой будут отрабатывать другие. Проблема в том, что адонетовское соединение не позволяет выполнять параллельные транзакции. Можно ли выкрутиться, используя только одно соединение?

Автор: Veitmen 19.3.2008, 23:37
Глянь тут
http://www.entityspaces.net/blog/CategoryView,category,Transactions.aspx
http://www.codeproject.com/KB/COM/complus_nhibernate_trans.aspx
http://www.codeplex.com/DbEntry/Wiki/View.aspx?title=Using%20transaction&referringTitle=Home

Может поможет

Автор: ivashkanet 20.3.2008, 15:48
frozer, в данном случае разбивают длинную (бизнес) транзакцию на несколько маленьких (системных) транзакций.
Чтобы данные между системными транзакциями не потеряли актуальность применяют автономную блокировку (АБ).
Различают оптимистическую и пессимистическую АБ.

Оптимистическая:
Условия применения: вероятность конфликта мала (либо длинна бизнес-транзакции мала, либо данные врятли понадобятся кому-то еще).
Реализация: перед выполнением очередной системной транзакции проверяется не изменились ли данные другой транзакцией. Если изменились транзакция завершается и юзеру выкидывается ошибка с просьбой начать сначала. 
Для определения изменились ли данные к объекту в базе данных добавляют новое поле: время последнего изменения либо версию объекта (увеличивается после каждого изменения).

Пессимистическая:
Условия применения: вероятность конфликта высока (либо длинна бизнес-транзакции велика, либо высокая конкуренция на доступ).
Реализация: В начале бизнес транцакции данные ей необходимо заблокировать (для этого, например, используют специальную таблицу блокировок). В конце транзакции блокировку снимают.

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

Существует еще и смешанная блокировка: оптимистическая на чтение и пессимистическая на запись.

Автор: frozer 20.3.2008, 20:02
Цитата(Veitmen @  19.3.2008,  23:37 Найти цитируемый пост)
Глянь тутhttp://www.entityspaces.net/blog/CategoryV...ansactions.aspx ...

Спасибо за ссылки, хотя они больше по теме распределенных транзакций   smile, может entityspaces подойдет - буду разбираться.


Цитата(ivashkanet @  20.3.2008,  15:48 Найти цитируемый пост)
frozer, в данном случае разбивают длинную (бизнес) транзакцию на несколько маленьких (системных) транзакций.Чтобы данные между системными транзакциями не потеряли актуальность применяют автономную блокировку (АБ)...

Огромное спасибо. Буду думать как это реализовать...

Автор: ivashkanet 21.3.2008, 09:28
frozer, не за что. Да и думать ничего не надо -- все уже давно придумано и описано:
http://www.codeproject.com/KB/dotnet/OptLocking_PrefixTable.aspx
http://www.codeproject.com/KB/aspnet/Concurrency_Control.aspx
http://www.codeproject.com/KB/vista/Data_Concurrency.aspx
http://www.codeproject.com/KB/database/concurmodel.aspx


Если в двух словах, то update строки тоблицы выглядит так
Код

Update objects Set name = :newName, description = :newDescription, version = version +1
where id = :id and version = :oldVersion

А потом смотрят сколько записей обновилось (update возвращает количество измененных записей).
Если 1 -- все ОК, 0 -- версия изменилась -- эксцепшен -- сообщение пользователю.

Автор: frozer 22.3.2008, 14:07
еще раз спасибо

Автор: ivashkanet 22.3.2008, 21:10
frozer, еще раз не за что ;-)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)