И ОПЯТЬ ТРАНЗАКЦИИ (в компонентах FibPlus)!

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

И ОПЯТЬ ТРАНЗАКЦИИ (в компонентах FibPlus)!

Сообщение Lars » 24 июл 2006, 07:13

Уже писал по этому поводу!

Практический пример, хочу практ. ответа.

10 датасетов FibPlus, формируют сетки справочников, сетки рабочих данных, отчеты. Находятся в ДатаМодуле.
У всех датасетов автокоммит. Справочные датасеты не имеют автокоммита, после выхода из них просиходит коммит всего сделанного.

----

Проблема
При открытой рабочей таблицы (все датасеты привязаны к 2 компонентам TpFIBTransaction - одна пишет, другая читает) открывается справочник, рабоается и закрывается. ВСЕ!!! Оба грида отображаются пустоты - запросы закрыты - естественная ситуация при коммите транзакции.
Попробовал делать CommitRetainng, лучше, но ....далее
----

Вопрос!
Сколько надо TpFIBTransaction на 10 рекордсетов, с учетом, что у каждого рекордсета есть Read и Update транзакции свойства.[/b]

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 24 июл 2006, 14:43

TpFIBDataSet.Transaction - читающая тразнакция (одна на всех).
TpFIBDataSet.UpdateTransaction - пишущая транзакция (одна на всех).

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Сообщение Lars » 25 июл 2006, 17:41

AlexandrS писал(а):Транзакции требуется две. Из того, что вы написали лично у меня возникает вопрос. А какой транзакции после ввода в справочник вы делаете commit?
UpdateTransaction

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Сообщение Lars » 25 июл 2006, 17:43

CyberMax писал(а):TpFIBDataSet.Transaction - читающая тразнакция (одна на всех).
TpFIBDataSet.UpdateTransaction - пишущая транзакция (одна на всех).
Но рекордсеты могут быть параллельно открыты и послежовательно закрываться! Дулаю коммит и все....

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Сообщение Lars » 25 июл 2006, 18:48

Lars писал(а):
CyberMax писал(а):TpFIBDataSet.Transaction - читающая тразнакция (одна на всех).
TpFIBDataSet.UpdateTransaction - пишущая транзакция (одна на всех).
Но рекордсеты могут быть параллельно открыты и послежовательно закрываться! Дулаю коммит и все....
И на отчеты одна транз. и на гриды тоже с одними настройками:?
read
read_committed
nowait
rec_version

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Сообщение Lars » 25 июл 2006, 18:56

AlexandrS писал(а):Tсли вы делаете Commit именно пишущей транзакции, то в обще не понятно как у вас получается пустой dataset как буд-то ему закрыли читающую
Делать коммит для читающей вообще не стоит?! У меня было такое мышление - поработал с данными, закрыл рекордсет и коммит поставил для читающей и если UpdateTransaction.InTransaction то и закоммиитить обновляющую.
А как поступать? закрывать рекордсет и оставлять транзакцию открытой?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 25 июл 2006, 19:14

Голубчик. Ну погоди ты сепетить ручками-то, подумай о том, что ты, собсно, делаешь, прежде чем вертеть то так то эдак. Транзакция - это что? Некоторый контекст, в котором выполняются операторы. Если говорить о модифицирующих - которые должны быть валидны только все вместе. Следственно, пока жива транзакция, выполненных в её контексте изменений ни для кого нет, кроме ней самой. Потому и нужно, чтоб они стали существовать для остальных, сделать ей коммит. Той, в которой пишем. Компрене ву? А читающая, если она read_commited, имеет право видеть изменения которые кто угодно закоммитил. На хрена её-то коммитить?

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Сообщение Lars » 25 июл 2006, 19:14

AlexandrS писал(а): Все, что вы бобавляете будет отображаться в dataset, не трогайте в обще читающую оперируйте только с пишущей
Понятно.
А в каком случае нужно делать коммит читающей транзакции? А обновления, появившиеся после старта чит. транз?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 25 июл 2006, 19:16

Уйди с глаз долой. На сайт, про транзакции читать. И про уровни изоляции. Потом приходи если чего непонятно.

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Сообщение Lars » 25 июл 2006, 19:18

Merlin писал(а):На хрена её-то коммитить?
Приложение отработало и осталась транзакция... ощущение, что чего-то не хватает...

Ну а как одна транзакция (компонет) может обслуживать несколько рекордсетов?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 25 июл 2006, 19:28

Lars писал(а): ощущение, что чего-то не хватает...
Ты уж прости меня грешного, но у меня тоже такое ощущение :-D
Lars писал(а): Ну а как одна транзакция (компонет) может обслуживать несколько рекордсетов?
Молча :-D

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Сообщение Lars » 25 июл 2006, 19:49

Merlin писал(а):Уйди с глаз долой. На сайт, про транзакции читать. И про уровни изоляции. Потом приходи если чего непонятно.
Смотрю, что здесь прямо принято всех отсылать читать сайт про транзакции. Читал, вопросы возникают. И вопрос практического характера. По книге Борри на каждый запрос нужная транзакция, вопрос был в добавлении одного комп.транз на комп. рекордсета.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 26 июл 2006, 11:40

Lars писал(а):read
read_committed
nowait
rec_version
Мда. "nowait" не нужен. Читаем http://www.ibase.ru/devinfo/ibx.htm, раздел TIBTransaction.
Для отчетов такой режим не подходит. Для этого есть snapshot. Об этом тоже где-то в документациях написано.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 26 июл 2006, 11:49

CyberMax писал(а):Мда. "nowait" не нужен. Для отчетов такой режим не подходит.
я бы сказал, что отчету должно быть глубоко пофиг на [no]wait. Откуда в нем конфликты?

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 26 июл 2006, 12:41

2 dimitr. Эти два предложения совсем про разное.
Я имел ввиду, что:
1. Для данных параметров транзакции, параметр wait/nowait не играет роли, поэтому указывать его не надо.
2. Под словом режим я подразумевал не wait/nowait, а snapshot/readonly-режим.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 26 июл 2006, 13:31

CyberMax писал(а):
Lars писал(а):read
read_committed
nowait
rec_version
Для отчетов такой режим не подходит. Для этого есть snapshot. Об этом тоже где-то в документациях написано.
Малость излишне категорично. Отчёты разные бывают. Не все же по горячим данным. И для аналитики редко нужна миллиметровая точность. А снапшот таки мусор держит, а отчёты затяжные случаюццо... Такшта всё по месту.

Ответить