Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Базы данных под .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, в данном случае разбивают длинную (бизнес) транзакцию на несколько маленьких (системных) транзакций. Чтобы данные между системными транзакциями не потеряли актуальность применяют автономную блокировку (АБ). Различают оптимистическую и пессимистическую АБ. Оптимистическая: Условия применения: вероятность конфликта мала (либо длинна бизнес-транзакции мала, либо данные врятли понадобятся кому-то еще). Реализация: перед выполнением очередной системной транзакции проверяется не изменились ли данные другой транзакцией. Если изменились транзакция завершается и юзеру выкидывается ошибка с просьбой начать сначала. Для определения изменились ли данные к объекту в базе данных добавляют новое поле: время последнего изменения либо версию объекта (увеличивается после каждого изменения). Пессимистическая: Условия применения: вероятность конфликта высока (либо длинна бизнес-транзакции велика, либо высокая конкуренция на доступ). Реализация: В начале бизнес транцакции данные ей необходимо заблокировать (для этого, например, используют специальную таблицу блокировок). В конце транзакции блокировку снимают. Реализация оптиместической блокаровки проста и не требует много знаний и внимания, пессимистическая же требует и того и другого. Поэтому в большинстве случаев рекомендуют использовать первую, и только в крайних случаях вторую. Существует еще и смешанная блокировка: оптимистическая на чтение и пессимистическая на запись. |
Автор: 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 возвращает количество измененных записей). Если 1 -- все ОК, 0 -- версия изменилась -- эксцепшен -- сообщение пользователю. |
Автор: frozer 22.3.2008, 14:07 |
еще раз спасибо |
Автор: ivashkanet 22.3.2008, 21:10 |
frozer, еще раз не за что ;-) |