Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Длинная транзакция в ADO.Net 
:(
    Опции темы
frozer
Дата 18.3.2008, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 18.3.2008
Где: Волгоград

Репутация: 1
Всего: 1



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

Это сообщение отредактировал(а) frozer - 18.3.2008, 22:55
PM MAIL   Вверх
Veitmen
Дата 19.3.2008, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: нет
Всего: 4



PM MAIL ICQ   Вверх
ivashkanet
Дата 20.3.2008, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 4
Всего: 149



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

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

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

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

Существует еще и смешанная блокировка: оптимистическая на чтение и пессимистическая на запись.
PM MAIL WWW ICQ   Вверх
frozer
Дата 20.3.2008, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 18.3.2008
Где: Волгоград

Репутация: 1
Всего: 1



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

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


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

Огромное спасибо. Буду думать как это реализовать...
PM MAIL   Вверх
ivashkanet
Дата 21.3.2008, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 4
Всего: 149



frozer, не за что. Да и думать ничего не надо -- все уже давно придумано и описано:
http://www.codeproject.com/KB/dotnet/OptLo...refixTable.aspx
http://www.codeproject.com/KB/aspnet/Concu...cy_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 -- версия изменилась -- эксцепшен -- сообщение пользователю.
PM MAIL WWW ICQ   Вверх
frozer
Дата 22.3.2008, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 18.3.2008
Где: Волгоград

Репутация: 1
Всего: 1



еще раз спасибо
PM MAIL   Вверх
ivashkanet
Дата 22.3.2008, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 4
Всего: 149



frozer, еще раз не за что ;-)

Это сообщение отредактировал(а) ivashkanet - 22.3.2008, 21:10
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0719 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.