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

Вниз

Читающая транзакция в dbExpress   Найти похожие ветки 

 
Juice ©   (2005-11-03 15:19) [0]

Очевидная задача. В TSQLConnection есть DirtyRead, ReadCommitted, RepeatableRead. В справке написано:
In addition, TSQLConnection lets you specify database-specific custom isolation levels. Custom isolation levels are defined by the dbExpress driver. See your driver documentation for details.
А где она, эта документация один Борланд наверное знает :) В нете ничего не находится, с справке тоже. Драйвер Interbase"овский, dbexpint.dll. Но остальные драйвера тоже интересуют, я на то и dbX юзаю, чтобы с  разными серверами работать.


 
Desdechado ©   (2005-11-03 15:58) [1]

не вижу связи темы и текста...
и чем тебя не устраивают стандартные уровни изоляции?


 
Juice ©   (2005-11-03 16:16) [2]

Может и нет связи. Тогда прошу обьяснить мне как dbExpress работает с транзакциями. Я понимаю так: если не создавать самому и не привязывать набры данных к собственной транзакции то библиотека стартует для кажого н.д. отдельную транзакцию, и завершает после вызова методов ApplyUpdates, CancelUpdates. По умолчанию вызывается CancelUpdates, т.е. если открыть а потом закрыть н.д. то данные на сервер не попадут. Как при таком раскладе задать "только чтение" ? Стартовать самому транзакцию, но как указать ей только читать ? Надо где-то указать ее параметры режима доступа, наверное ж в IsolationLevel, больше негде. Это все мои догадки.


 
Курдль ©   (2005-11-03 16:27) [3]

Не уверен, но мне кажется, что такой изврат, как "читающая транзакция" есть только у IB. Но раз указано [D7, Все сразу], то это ставит в тупик.

Если открыть и закрыть НД (это DataSet.Open/.Close?) то данные на сервер, вроде, и не должны попасть...

Удивительно, что Вы ведь совершенно правильно описали про ApplyUpdates...

Чем не подходит метод "попадания данных на сервер" DataBase.ApplyUpdates([DataSet1, DataSet2...])?


 
Desdechado ©   (2005-11-03 16:36) [4]

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


 
Juice ©   (2005-11-03 16:37) [5]


> Не уверен, но мне кажется, что такой изврат, как "читающая
> транзакция" есть только у IB. Но раз указано [D7, Все сразу],
>  то это ставит в тупик.

Ну насчет других не знаю, но в мануалах Interbase как-то вычитал что read-only меньше нагружает IB-сервера последних версий. Ну да ладно с этим read, а если нужны остальные параметры ? Режим блокировки установить  или отличный от стандартного уровень изоляции, например consistency, вариации с rec_version ?


 
Desdechado ©   (2005-11-03 16:41) [6]

все это можно указать в параметрах SQLConnection


 
Курдль ©   (2005-11-03 16:41) [7]


> Режим блокировки установить  или отличный от стандартного
> уровень изоляции, например consistency, вариации с rec_version
> ?


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


 
Juice ©   (2005-11-03 16:45) [8]


> Данные на сервер попадают только в случае вызовов специальным
> методов компонентов или при вызове пишущих запросов. И только
> при явном подтверждении оных.

А есть различия в работе с транзакциями между датасетами что получиили в результате выборки данные для редактирования и датасетами которые просто выполняют insert,delete или update ? В любом случае нужно вызывать ApplyUpdates. Кстати, интересно что будет если вызвать ApplyUpdates для датасета что находится в явной транзакции? Ща попробую. И если речь уже зашла об завершении, то как завершить CommitRetaining ?  Или в других серверах такого нет ? Если нельзя то нехорошо получается, нет универсальности механизма.


 
Курдль ©   (2005-11-03 16:48) [9]


> А есть различия в работе с транзакциями между датасетами
> что получиили в результате выборки данные для редактирования
> и датасетами которые просто выполняют insert,delete или
> update ?


Ну, по уму датасэты вообще не для активных DML (типа insert/update/delete).
Для этого больше подходят компоненты попроще. Или нормально отрабатывает связка DataSet - UpdateObject (последний-то и содержит эти DML и откликается на команды "Apply".


 
Juice ©   (2005-11-03 16:50) [10]


> Если не хочешь нарваться на неприятность, "откудась не ждали"
> - юзай только ReadCommited. Если юзверей не много - блокировки
> не страшны. Только следи за "пишущими транзакциями", шоб
> не висели открытыми.

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


 
Juice ©   (2005-11-03 16:57) [11]


> Ну, по уму датасэты вообще не для активных DML (типа insert/update/delete).
>
> Для этого больше подходят компоненты попроще. Или нормально
> отрабатывает связка DataSet - UpdateObject (последний-то
> и содержит эти DML и откликается на команды "Apply".

В старых добрых IBX все было просто и понятно, а тут и UpdateObject"a вовсе нету. Компоненты сами волшебным образом производят модификацию.

> Для этого больше подходят компоненты попроще.

Но все-таки, если допустим в TSQLDataSet выполнить DML-команду то когда она будет закомичена ? Когда я вызову ApplyUpdates. А если закрою датасет без вызова Apply то неявная транзакция завершится как Roollback ? Ведь так? Да и какие попроще, TSQLDataSet центральный компонент, остальные для перехода с BDE предназначены.


 
Курдль ©   (2005-11-03 16:57) [12]


> Да и вообще шаманить с транзакциям чревато серьезными последствиями.


Да не сказал бы.
Просто рекомендую понапрасну их не дергать.
Без них не обойтись, когда модифицируется связанный пакет данных для разных таблиц и данные должны либо всем пакетом утвердиться в базе, либо "отмениться". В остальных случаях за глаза хватает "умолчательных".


 
ANB ©   (2005-11-03 17:38) [13]

Режим только-чтение вообще то нормально организуется раздачей только нужных грантов пользователям.


 
Juice ©   (2005-11-03 19:48) [14]

Поэкспериментировал я тут, и вот какая картина сложилась:
Эксп. 1 - неявные транзакции:
а) Как только выполнена DML команда SQLDataSet1.ExecSQL результат сразу появляется на сервере, т.е. мгновенный commit, чего и следовало ожидать. б) Если использовать CDS то данные попадают на сервер только после ClientDataSet1.ApplyUpdates, Close вызывает CancelUpdates, т.е. все как я и говорил.
Интересно то, что во время редактирования данных в CDS свойство SQLConnection1.InTransaction находится в false. Как же он тогда это делает, через какое подключение ?
Эксп. 2 - явные транзакции:
а) Все манипуляции delete/update/insert  что выполняются во всех  SQLDataSet"ах(настроенных на эту транзакцию) попадают в транзакцию и управляются ею - тут все ОК.
б) Стандартная цепочка - ClientDataSet1 - DataSetProvider1 - SQLDataSet1, SQLDataSet1.TransactionLevel установленн соотв. образом. Стартуем транзакцию, открываем CDS, при этом SQLDataSet открывается и сразу же закрывается, редактируем данные, выполняем Rollback - в гриде как были данные так и есть, CDS открыт! Короче, явные транзакции не затрагивают вообще CDS. Хоть это и не проблема вовсе ведь у него есть аналогичные методы Apply/Cancel но было бы интересно узнать как он выполняет модификации, через какое соединение и через какую транзакцию ? Мутно все как-то получается.


 
Juice ©   (2005-11-04 11:01) [15]


> Desdechado ©   (03.11.05 16:41) [6]
> все это можно указать в параметрах SQLConnection

А где взять эту самую информацию ? Можно-то можно, но надо же знать что там указывать!


 
Juice ©   (2005-11-04 17:11) [16]

Ха :) А вот что я нашел в ньюсгруппах:

Unfortunately there is no way to set the read only option for a
transaction with dbExpress. You can specify all transaction options
with the InterBase Express components.



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

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

Наверх





Память: 0.5 MB
Время: 0.014 c
1-1133184391
revenkov
2005-11-28 16:26
2005.12.25
Как добавить в свою dll-ку компонент (неизуальный)


14-1133431408
X9
2005-12-01 13:03
2005.12.25
Проблема с телевизором (Sony KV-M2181KR)


1-1133439831
ramzes13
2005-12-01 15:23
2005.12.25
Как в RichEdit отобразить спецсимволы


6-1126543519
Илья Бобров
2005-09-12 20:45
2005.12.25
Как сростить Indy Ftp и ProgressBar


3-1131379841
linx
2005-11-07 19:10
2005.12.25
Получить строчку с максимальным значением





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский