Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Транзакции, cached updates и saVCL / 13 сообщений из 13, страница 1 из 1
08.08.2006, 21:30
    #33906643
Aleksey Kh.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции, cached updates и saVCL
Чет туплю под вечер и не могу сообразить:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
doSaTransactions. Определяет порядок управления транзакциями в СУБД. 
Если параметр doSaTransactions включен, 
то вызовы процедур TransactStart, TransactCommit, TransactRollback 
приводят к исполнению в СУБД cоответственно команд BEGIN TRANSACTION, COMMIT и ROLLBACK.  
При этом на уровне компоненты никакого другого управления транзакциями не происходит. 
Если параметр doSaTransactions не включен (по умолчанию), то на уровне компоненты управление 
транзакциями происходит по следующим правилам: 
 1 . После успешного выполнения TSaDs.Post, TSaDs.Delete, TSaDs.ExecuteSql, TSaDs.ExecuteSqlImmediate, TSaDs.ApplyCachedUpdates 
в том случае, если не было открытой транзакции, в СУБД выполняется команда COMMIT. 
Транзакция открывается вызовом TransactStart. 
Транзакция закрывается вызовами TransactCommit или TransactRollback. 
 2 . При вызове процедуры TransactStart в СУБД команда BEGIN TRANSACTION не выполняется. 
 3 . Вызовы процедур TransactCommit, TransactRollback
приводят к исполнению в СУБД соответственно команд COMMIT и ROLLBACK.

1. Если doSaTransactions:=false, и напрямую я транзакции не стартую, то:
1.1. в какой момент транзакция стартует и завершается? Стартуется после TSaDs.Open и завершается после каждого TSaDs.Close?
1.2. заблокировать записи от изменений другими транзакциями тогда можно с помощью
Код: plaintext
select ... for update
и записи заблокируются до выполнения Close?
1.3. ExecuteSQL стартует транзакцию, которая автоматически завершается по его выполнении либо commit'ом либо rollback'ом в зависимости от успешности его выполнения?

2. Если я хочу использовать cached updates, но не хочу на все время этих updates держать транзакцию открытой, какой д.б. последовательность действий?
...
Рейтинг: 0 / 0
08.08.2006, 21:35
    #33906646
Aleksey Kh.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции, cached updates и saVCL
p.s. read commited, в первом случае я кеширование не использую.
...
Рейтинг: 0 / 0
09.08.2006, 01:54
    #33906830
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции, cached updates и saVCL
Aleksey Kh.1. Если doSaTransactions:=false, и напрямую я транзакции не стартую, то:Читай внимательнее. Если doSaTransactions:=false, то ты вообще не сможешь стартовать транзакцию.

Aleksey Kh.1.1. в какой момент транзакция стартует и завершается? Стартуется после TSaDs.Open и завершается после каждого TSaDs.Close?Транзакция всегда стартует автоматически при первом же обращении к таблице. А TSaDs.Close транзакцию никогда не завершает. Конец выборки резалтсета не является основанием для завершения транзакции :)

Aleksey Kh.1.2. заблокировать записи от изменений другими транзакциями тогда можно с помощью
Код: plaintext
select ... for update
и записи заблокируются до выполнения Close?Да, заблокируются. Нет Close не снимет блокировку. А вот Post, ApplyCachedUpdates или TransactCommit, TransactRollback - снимут.

Aleksey Kh.1.3. ExecuteSQL стартует транзакцию, которая автоматически завершается по его выполнении либо commit'ом либо rollback'ом в зависимости от успешности его выполнения?Не стартует, а продолжает на самом деле. Стартовать транзакцию он будет если до этого не было открытой транзакции, но если перед ExecuteSQL ты сделал несколько раз SaDs1.Open/SaDs1.Close, то ExecuteSQL продолжит и завершит транзакцию открытую первым вызовом SaDs1.Open.

Aleksey Kh.2. Если я хочу использовать cached updates, но не хочу на все время этих updates держать транзакцию открытой, какой д.б. последовательность действий?ээээ..... а смысл?

Почитай в BOL главу:
Код: plaintext
1.
ASA SQL User's Guide 
Using Transactions and Isolation Levels
Все станет намного понятнее :)
И обрати внимание на опцию базы CHAINED или опция ODBC AutoCommit. TSaDB.doSaTransactions сделана по образу и подобию этой самой CHAINED.
...
Рейтинг: 0 / 0
09.08.2006, 09:59
    #33907118
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции, cached updates и saVCL
На всякий случай напоминаю. Есть форум про SaVCL
и там похожая тема уже обсуждалась
...
Рейтинг: 0 / 0
09.08.2006, 14:32
    #33908122
Aleksey Kh.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции, cached updates и saVCL
Aleksey Kh.2. Если я хочу использовать cached updates, но не хочу на все время этих updates держать транзакцию открытой, какой д.б. последовательность действий?ээээ..... а смысл?

смысл - не держать транзакцию открытой :)
(не держать блокировки и не мешать работать другим)

а сами cached updates - накапливать изменения на клиенте и применять их по желанию пользователя.

Про RUSUG я знаю давно (avkh мое второе имя ), но метаться между двумя форумами - неудобно.
За ссылку - шпасибо.
...
Рейтинг: 0 / 0
09.08.2006, 17:57
    #33908947
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции, cached updates и saVCL
Aleksey Kh. Aleksey Kh.2. Если я хочу использовать cached updates, но не хочу на все время этих updates держать транзакцию открытой, какой д.б. последовательность действий?ээээ..... а смысл?
смысл - не держать транзакцию открытой :)
(не держать блокировки и не мешать работать другим)
а сами cached updates - накапливать изменения на клиенте и применять их по желанию пользователя.Ну так cashed updates по определению придуманы для того чтобы держать транзакцию открытой во время накопления.
...
Рейтинг: 0 / 0
09.08.2006, 18:29
    #33909049
Aleksey Kh.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции, cached updates и saVCL
[quot White OwlНу так cashed updates по определению придуманы для того чтобы держать транзакцию открытой во время накопления.[/quot]
Т.е. если открыть датасет с кешированием, то при подтверждении транзакции он закроется?
...
Рейтинг: 0 / 0
09.08.2006, 18:43
    #33909099
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции, cached updates и saVCL
Aleksey Kh. White OwlНу так cashed updates по определению придуманы для того чтобы держать транзакцию открытой во время накопления.
Т.е. если открыть датасет с кешированием, то при подтверждении транзакции он закроется?Да конечно. Как только скомандуешь ApplyCaсhe или ApplyCachedUpdates так и опаньки :) При удачном сохранении кэша в базу автоматически пойдет команда commit, при неудачном rollback. В любом случае транзакция завершится и блокировки снимутся.
...
Рейтинг: 0 / 0
09.08.2006, 19:15
    #33909181
Aleksey Kh.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции, cached updates и saVCL
Это понятно (ну кроме того, что транзакция завершится - вроде чуть выше меня убеждали в обратном).
Я про другое: т.е. при TSaDb.TransactCommit для всех связанных с этим TSaDb датасетах TSaDs выполнится ApplyCaсhe?
...
Рейтинг: 0 / 0
09.08.2006, 19:40
    #33909226
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции, cached updates и saVCL
Aleksey Kh.Это понятно (ну кроме того, что транзакция завершится - вроде чуть выше меня убеждали в обратном).Э? Кто-когда убеждал в обратном? Или убеждавший не так выразился, или ты не так понял :)

Aleksey Kh.Я про другое: т.е. при TSaDb.TransactCommit для всех связанных с этим TSaDb датасетах TSaDs выполнится ApplyCaсhe?Нет. Не выполнится. Во всяком случае в SaVCL 2.11 точно не выполнится. Наверное это надо считать багом...
...
Рейтинг: 0 / 0
09.08.2006, 20:10
    #33909265
Транзакции, cached updates и saVCL
Что-то вы тут намутили... Или я что-то не понял (в отпуске сейчас, особо вникать времени нет :) ) Cached updates я в основном применяю для редактирования конструкций типа мастер-детализация-деталиация к детализации и т.д. В этом случае открываем все связанные датасеты, ставим им cached:=true, редактируем, а когда надо внести изменения в БД делаем что-то типа вот этого (для двух датасетов):

oSaDs1.SaDb.TransactStart;
try
oSaDs1.ApplyCachedUpdates;
oSaDs2.ApplyCachedUpdates;
oSaDs1.SaDb.TransactCommit;

oSaDs1.ClearCache( false ); //или true, если планируется дальнейшее редактирование
oSaDs2.ClearCache( false ); //или true, если планируется дальнейшее редактирование
except
on e : Exception
do begin
oSaDs1.SaDb.TransactRollBack;
raise;
end;
end;

Транзакция открыта только в момент обновления данных, при редактировании вроде как нет открытых транзакций.

Кеширование и транзакции совершенно разные и не связанные друг с другом вещи, и почему при закрытии транзакции для всех датасетов должны автоматически выполняться applycahed я не понимаю...

С уважением, Сергей Гаврилов.
...
Рейтинг: 0 / 0
09.08.2006, 23:01
    #33909416
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции, cached updates и saVCL
Сергей Гавриловчто-то типа вот этого (для двух датасетов):

oSaDs1.SaDb.TransactStart;
try
oSaDs1.ApplyCachedUpdates;
oSaDs2.ApplyCachedUpdates;
oSaDs1.SaDb.TransactCommit;
Это при doSaTransactions = true. А мы говорим про doSaTransactions = false.

Сергей ГавриловКеширование и транзакции совершенно разные и не связанные друг с другом вещи, и почему при закрытии транзакции для всех датасетов должны автоматически выполняться applycahed я не понимаю...Ну как вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SaDb1.doSaTransactions := false;
SaDs1.Cached := true;
SaDs2.Cached := true;
SaDs1.Open;
SaDs2.Open;
/// изменяем данные в обоих ds
SaDs1.ApplyCache;
// здесь произошел автоматический коммит который закрыл транзакцию для обоих SaDs.
// И в это время с другой станции, другой юзер уже может править таблицу открытую в SaDs2. Блокировка то снялась.
SaDs2.ApplyCache; // уже будет править не те данные которые прочитал.
...
Рейтинг: 0 / 0
10.08.2006, 21:00
    #33911682
Aleksey Kh.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакции, cached updates и saVCL
[quot White OwlЭто при doSaTransactions = true. А мы говорим про doSaTransactions = false.[quot]
Вообще-то, я - нет :)
Для своего п.2 в первом посте я на этом не настаиваю.
Наверное, отсюда и путаница :)
Меня, в общем, интересовало именно вот это:
Кеширование и транзакции совершенно разные и не связанные друг с другом вещи, и почему при закрытии транзакции для всех датасетов должны автоматически выполняться applycahed я не понимаю...
ну и теперь понятно, что это возможно только при ручном управлении транзакциями.
спс :)
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Транзакции, cached updates и saVCL / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]