Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];

Вниз

Нужен пример работы с транзакциями.   Найти похожие ветки 

 
Hmm ©   (2004-11-29 22:45) [0]

Здраствуйте. Запутался в организации транзакций в своём приложении.

На форме лежит IBDataBase, связанный с ним IBTransaction и IBDataset, в котором на событие BeforPost пытаюсь сделать IBTransaction1.starttransaction, а в событии AfterPost IBtransaction1.commit.

Делфя ругается на, то что transaction is active. Ежели я в момент создания формы закрываю транзакцию IBTransaction.active:=false, то приходится лицезреть пустые гриды, видимо мои Dataset-ы тоже закрываются.

В литературе, которую использую я, о транзакциях написанно невнятно, посему прошу объяснить на пальцах, либо кинуть ссылочку - как оргинизовывать транзакции в делфе.


 
DrPass ©   (2004-11-29 22:53) [1]


> котором на событие BeforPost пытаюсь сделать IBTransaction1.starttransaction,

Если ты делаешь Post, значит, у тебя уже открыт DataSet. А значит, транзакция уже активна. Кстати, StartTransaction вызывается автоматически при открытии датасета (я так понимаю, у тебя это происходит при запуске программы), и этот метод обычно вызывать не требуется.
По поводу Commit - завершая транзакцию ты автоматически закрываешь и все связанные с ней датасеты, поэтому тебе после этого придется опять же лицезреть пустой грид. Чтобы этого не происходило, вызывай CommitRetaining - сохранение изменений на текущий момент без завершения транзакции.


 
Hmm ©   (2004-11-29 23:09) [2]

Всё это я уже понял, экспериминтирую с открываниями/закрываниями транзакций и датасетов.

Но ведь если один пользователь БД находится в транзакции, то другой не сможет производить изменения в этой БД, до завершения транзакции первым?

Если так, то при такой организации работы база будет всёравно что однопользовательской.

Если сказанное выше верно, то возникает вопрос: как наблюдать данные в гриде, не находясь в транзакции?
Если же не верно, то как обстоят дела на самом деле?


 
Vemer ©   (2004-11-29 23:27) [3]

Обычно используют 2 транзакции (или больше).

Первая читающая (Read Only, Read Commited),открыта постоянно.

Вторая -  пишущая (без доп. параметров в IBX). Пишущая стартует по мере необходимости, делает свои черные дела и коммитится.

Про это и способы блокировки записей можно почитать на Ibase.Ru


 
DrPass ©   (2004-11-29 23:33) [4]


> Если сказанное выше верно, то возникает вопрос: как наблюдать
> данные в гриде, не находясь в транзакции?

Никак. Любое действие происходит в контексте той или иной транзакции.

> Но ведь если один пользователь БД находится в транзакции,
> то другой не сможет производить изменения в этой БД, до
> завершения транзакции первым?

Верно. Поэтому есть разные варианты, например,
1. Просмотр и добавление/изменении осуществляются в разных транзакциях. При добавлении/изменении пускается EVENT, который сообщает клиенту об изменениях и необходимости перечитать данные
2. Вообще не держишь DataSet открытым, и не используешь DBGrid. Открыл, прочитал, отобразил в какой-нибудь StringGrid, закрыл. Если наборы данных не слишком большие - это замечательный метод. А уведомления - теми же EVENT"ами


 
jack128 ©   (2004-11-29 23:33) [5]

Hmm ©   (29.11.04 23:09) [2]
http://www.ibase.ru/develop.htm читать всё, в обязательном порядке.


 
Hmm ©   (2004-11-30 00:01) [6]

Ну в общем-то ясно, что читать в обязательном порядке... Всеж кое-что уже понятно. Спасибо всем!


 
Deniz ©   (2004-11-30 06:33) [7]

> DrPass ©   (29.11.04 23:33) [4]
> > Но ведь если один пользователь БД находится в транзакции,
> > то другой не сможет производить изменения в этой БД, до
> > завершения транзакции первым?
>
> Верно.

НЕ ВЕРНО!
Второй пользователь не сможет делать изменения только если первый пользователь явно заблокировал(select with lock или update ...) запись(или несколько) и при этом не завершил транзакцию. Но это достаточно редкий случай.


 
msguns ©   (2004-11-30 10:57) [8]

>Deniz ©   (30.11.04 06:33) [7]
>Второй пользователь не сможет делать изменения только если первый пользователь явно заблокировал(select with lock или update ...) запись(или несколько) и при этом не завершил транзакцию.  

В IB можно заблокировать запись ? И даже несколько ?


 
HSolo ©   (2004-11-30 11:04) [9]

>В IB можно заблокировать запись ? И даже несколько ?

http://ibase.ru/devinfo/pslock.htm


 
msguns ©   (2004-11-30 11:35) [10]

>HSolo ©   (30.11.04 11:04) [9]

У меня эта статья настольная ;)
Но в ней описывается как можно сэмулировать блокировку записи (сей), играя уровнями изоляции транзакций и режимом ожидания. Прямых же блокировок записей в IB с его версионностью нет и быть не может.


 
HSolo ©   (2004-11-30 12:15) [11]

>У меня эта статья настольная ;)
У меня тоже :) Я имею в виду ее дополнение, начиная с этих слов:

Настал момент поговорить о новых возможностях по блокировке, появившихся в FB 1.5.
<cut>
В FB 1.5. включена новая функциональность -

Select ... From Table [Where ...] [Order By ...] For Update With Lock


 
msguns ©   (2004-11-30 12:49) [12]

>HSolo ©   (30.11.04 12:15) [11]
Спасибо за справку. У меня 1.0


 
Hmm ©   (2004-11-30 22:31) [13]

но ведь FB и IB - не одно и тоже? следовательно такая фишка

Select ... From Table [Where ...] [Order By ...] For Update With Lock в IB 6.5 не пройдет?


 
Deniz ©   (2004-12-01 06:42) [14]

Запусти холостой update для записи, которую хочешь заблокировать.
update table set Field1 = Field1 where ID=123
Если транзакцию не закрывать, то другие клиенты получат error при попытке что-то сделать с записью.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.04 c
3-1101295329
Clone
2004-11-24 14:22
2004.12.26
DBGrid, Lookup Field, "Non-nullable column cannot be updated..."


14-1102431862
savva
2004-12-07 18:04
2004.12.26
OFFTOPIC: Пути Суприма неисповедимы:)


1-1102916467
Sicwell
2004-12-13 08:41
2004.12.26
Создать поток в DLL


3-1101458305
ocean
2004-11-26 11:38
2004.12.26
Репликация MS SQL


14-1102323016
infom
2004-12-06 11:50
2004.12.26
Верите ли вы в победу ЦСКА в Париже ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский