Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как организовать откат транзакции? [D6, IB6.x]


Страницы:   1 2

YK ©   (2005-02-01 07:05:00) 

Уважаемые Мастера!
Подскажите пожалуйста, как
организовать откат транзакции для InterBase.
Нужно ли создавать транзакцию на сервере?
через Transaction.Rollback не работает:(


msguns   (2005-02-04 12:02:00) [1]

Поправка к [27]
Фразу
После коммита/роллбака пишущих транзакций переоткрывать НД, связанные с таблицами БД, измененными этими транзакциями, но работающие в контексте других транзакций.
читать как
После коммита пишущих транзакций переоткрывать НД, связанные с таблицами БД, измененными этими транзакциями, но работающие в контексте других транзакций

Если пишущая откачена, то перечитка отображаемых курсоров не нужна (за исключением некоторых особых случаев, но это уже дебри)


Danilka   (2005-02-04 10:58:00) [2]

[29] Sergey13 ©   (04.02.05 10:45)
И вообще, мне нравятся последнее время клиентские курсоры - закачал что надо и закрыл транзакцию, поменял все что надо - открыл транзакцию, внес изменения, завершил ее. Главное не переборщить с забираемыми с серверами данными, много сразу не просить. Влияние АДО и МССкуля. :)) Но стандартными компонентами доступа для IB такой номер не пройдет.


Danilka   (2005-02-04 10:53:00) [3]

[29] Sergey13 ©   (04.02.05 10:45)
Дык, только для чтения транзакции стоят дешевле, думаю будет заметно на большой нагрузке сервера, когда долгие транзакции только для чтения, а отдельные короткие на запись.
Хотя, если честно, сам уже давно с IB не сталкивался, да и когда сталкивался, то негрузка небольшая. Сам на работе только с Ороклом дело имею, а IB, MSSQL это уже так, халтурка или для себя. :))


Sergey13   (2005-02-04 10:45:00) [4]

2[28] Danilka ©   (04.02.05 10:32)
А я применяю отдельнуюпишущую транзакцию в основном только тогда, когда мне нужны действительно согласованные действия, типа одновременное удаление/вставка/изменение разных таблиц. Меняя в гриде можно закомитить и текущую, главное не забывать про это. На перечитывании опять же экономлю. Может сказывается, что в основном я с Оракулом работаю - привычка.


Danilka   (2005-02-04 10:32:00) [5]

[27] msguns ©   (04.02.05 10:27)
> При изучении механизма транзакций особое внимание уделяем
> параметрам транзакции и понимаю конкурентости и изолированности
> транзакций.

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


msguns   (2005-02-04 10:27:00) [6]

> if(IBTransaction.Active=false)then
begin IBTransaction.StartTransaction;end ;

Убираем корявость и делаем код читабельным:

with IBTransaction do
 if not InTransaction then StartTransaction;

>try
// IBQuery.Open;  
<Что-то меняем в БД (ХП или пишущий запрос)>
IBTransaction1.Commit;  
except
IBTransaction1.Rollback;
end;

Транзакциям, в которых данные только читаются,коммит давать не обязательно. По завершению проги они "закрываются" автоматически.
После коммита/роллбака пишущих транзакций переоткрывать НД, связанные с таблицами БД, измененными этими транзакциями, но работающие в контексте других транзакций.
Если "читающая" транзакция типа снапшота ("копия" БД на момент старта транзакции), то после коммита пишущих транзакций надо перестартовать ее, а все запросы переоткрыть

При изучении механизма транзакций особое внимание уделяем параметрам транзакции и понимаю конкурентости и изолированности транзакций.

Желаю успеха !


Danilka   (2005-02-04 09:45:00) [7]

[23] Johnmen ©   (01.02.05 15:21)
Ну что-ты так сразу. Может это он операцию по смене пола недавно сделал, не привык еще, ему теперь понимание и сочуйствие надо, а ты смеешся. Ай-яй-яй. :))

[24] YK ©   (04.02.05 05:49)
> транзакции это не такой классный способ применения/отмены
> типа (Undo/Redo) это такие штучки для поддержания целостности
> базы данных и короче от глюков (простите за дурацкую формулировку)...

Транзакции это не штучки. Транзакция это неделимый, для сервера, набор операций, либо они все выполняются (commit) либо ничего не выполняется (rollback).


Rule   (2005-02-04 09:09:00) [8]

YK ©   (04.02.05 5:49) [24]

поздравляю, начинаешь постигать основы теории БД, это не каждому дано :)


YK   (2005-02-04 05:49:00) [9]

Уважаемые Мастера!
Я всё-таки разобралась с транзакциями.
Как всегда у меня бывает,
ваш ответы были абсолютно верными, и я действительно не понимала суть транзакций (хотя может быть и теперь не очень поняла).
Но как говориться, пока сам не сделаешь - ничего не поймешь.

Короче так:
транзакции это не такой классный способ применения/отмены типа (Undo/Redo) это такие штучки для поддержания целостности базы данных и короче от глюков (простите за дурацкую формулировку)...

Для их использования делают так:

 if(IBTransaction.Active=false)then
 begin IBTransaction.StartTransaction;end ;
try
 IBQuery.Open;
 IBTransaction1.Commit;
  {если всё хорошо , то изменения в базе данных сохранились}
except
 IBTransaction1.Rollback;
 {если глюк - то базу данных не мучаем}
  end;

 Большое спасибо Всем!


Johnmen   (2005-02-01 15:21:00) [10]

"я почитал" (c) Катюха

Прикольно :)


yk   (2005-02-01 15:08:00) [11]

Насчет транзакции я почитал
почти весь ibase.ru
Просто я не могу понять как работает
компанент IBTransaction

Например я посылаю какой-нибудь
запрос из Query
затем делаю Commit
Изменения в базе подтвердились

Затем читаю из базы

Если я хочу отменить результату запроса, то следует делать rollback?


Johnmen   (2005-02-01 13:11:00) [12]

ADD
ИМХО, у тебя все таки отсутствует желание почитать по приведенной ссылке и вникнуть, и => понимание самого термина - транзакция.


Sergey13   (2005-02-01 13:00:00) [13]

ИМХО, у тебя все таки отсутствует понимания самого термина - транзакция.
Транзакция это набор действий с БД обеспечивающий целостность и непротиворечивость данных. Это может быть и смена даты в гриде и перерасчет остатков по всем складам транснациональной корпорации. Без разницы, главное, что бы после завершения ее данные были целостными и непротиворечивыми.

В "commit после каждой зап" транзакция выступает как инструмент оптимизации, и в общем мало соотносится с собственно понятием транзакции. Может это и плохо звучит.


YK   (2005-02-01 12:50:00) [14]

Хороший пример со складской системой.
Но как это организовано?
Кстати насчет того чтобы commit после каждой записи...
Это плохо тем, что откатить нельзя?

Так чем лучше commit не после каждой записи?
Или нужно ждать rollback?
8-(


Johnmen   (2005-02-01 11:05:00) [15]

Общие правила для общих случаев...


Sergey13   (2005-02-01 11:01:00) [16]

2 [16] Sergey_Masloff   (01.02.05 10:58)
Поэтому у меня и в кавычках. 8-)


Sergey_Masloff   (2005-02-01 10:58:00) [17]

Sergey13 ©   (01.02.05 10:55) [14]
>Вклинюсь в спор с офтопиком.
>Все таки говоря об "общих правилах" следует помнить, что >это "общие правила" для ИБ.
Да и для IB не общие.


Sergey_Masloff   (2005-02-01 10:56:00) [18]

msguns ©   (01.02.05 10:50) [13]
Ты меня неправильно прочел ;-) Посмотри еще раз - что я писал про короткие транзакции а не что ты прочел ;-)


Sergey13   (2005-02-01 10:55:00) [19]

Вклинюсь в спор с офтопиком.
Все таки говоря об "общих правилах" следует помнить, что это "общие правила" для ИБ.


msguns   (2005-02-01 10:50:00) [20]

>Sergey_Masloff   (01.02.05 10:20) [10]
А что-транзакция должна быть максимально короткой!

Не обязательно. Пример - откат прихода в складских системах с учетом по поставкам. При откате всего лишь одного прихода выполняется куча операций:
1. Все документы с позициями этого прихода откатываются
2. При откате каждого документа кол-ва товара его фактуры "возвращается" (для прихода - снимается) на склад
3. Делаются соотв.отметки в таблицах заказов и заявок
4. Делается пересчет текущих "живых" балансов.
5. В заголовках откаченных документов делаются правки.

И все это ДОЛЖНО ВЫПОЛНИТЬСЯ В РАМКАХ ОДНОЙ ПИШУЩЕЙ ТРАНЗАКЦИИ !

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо