Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Начало транзакции -> Конец транзакции? / 16 сообщений из 16, страница 1 из 1
16.05.2003, 12:15
    #32161613
Gri3ly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Начало транзакции -> Конец транзакции?
Подскажите, плз, есть ли в Access такая вещь, как "начало транзакции" и "конец транзакции", т.е. чтоб если комп например вдруг вырубился делался откат и данные не пропадали?
...
Рейтинг: 0 / 0
16.05.2003, 12:23
    #32161632
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Начало транзакции -> Конец транзакции?
Workspace.BeginTrans
Workspace.CommitTrans
Workspace.Rollback

Откат сам произойдет если комп вырубится
...
Рейтинг: 0 / 0
16.05.2003, 13:18
    #32161726
Gri3ly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Начало транзакции -> Конец транзакции?
Workspace.BeginTrans - начало
Workspace.CommitTrans - конец
Workspace.Rollback - откат

я правильно понимаю?

и еще, это касается всех операций или только например запросов? у меня есть огромная функция, с кучей ветвлений, для работы с данными используется DAO. Могу ли я просто поставить в начале и в конце функции признаки начала и завершения транзакции? И если я разобью это функцию на несколько мелких, которые будут вызываться из одной главной, можно ли будет ставить признаки начала и завершения транзакции в этой ф-ции или это надо будет делать непосредственно в вызываемых ф-циях?
...
Рейтинг: 0 / 0
16.05.2003, 13:29
    #32161736
Senin Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Начало транзакции -> Конец транзакции?
Только когда будешь писать прогу пиши примерно так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
   Dim ws                         As DAO.Workspace

    Set ws = DBEngine( 0 )
    On Error Resume Next
    ws.BeginTrans

    'куча операторов

    If err.Number <> 0 Then
        'есть ошибка - откат
        ws.Rollback
    Else
        'нет ошибки- фиксируем
        ws.CommitTrans
    End If

   ws.Close
   set ws=Nothing 


Все остальные подробности см. в хелпе.
Транзакция - это основа всякой нормальной базы данных (и программы) .
И в этом топике всего не пересказать. Замечу, что в некоторых случаях, применения транзакций может увеличить производительность. Но это уже другая тема...

З.Ы.
для ADO используется похожий синтаксис, но уже через Conection...
З.Ы.Ы.
Access почти всегда делает неявные транзакции сам...
...
Рейтинг: 0 / 0
16.05.2003, 15:00
    #32161852
Gri3ly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Начало транзакции -> Конец транзакции?
Закрепляем пройденый материал :-)))

Правильно ли будет так написать процедуру:

Private Sub Import_Click()

Dim ws As DAO.Workspace
Dim dbMyDB As DAO.Database
Dim rcdProd As DAO.Recordset
Dim rcdRealiz As DAO.Recordset

On Error GoTo err

Set ws = DBEngine(0)
Set dbMyDB = CurrentDb()
Set rcdProd = dbMyDB.OpenRecordset("tblMowe")
Set rcdRealiz = dbMyDB.OpenRecordset("tblNewRealiz")

ws.BeginTrans

Do Until rcdRealiz.EOF

With rcdProd
.AddNew
![Price ãðí] = rcdRealiz![Price otp]
![Price rozn] = rcdRealiz![Price]
![Skidka_Value] = rcdRealiz![Skidka]
![Prodavec] = rcdRealiz![Merch]
![DK_Num] = rcdRealiz![DK] + " "
![ID] = Me![ID]
.Update
End With
rcdRealiz.MoveNext

Loop

rcdRealiz.Close

DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE tblNewRealiz.* FROM tblNewRealiz;"
DoCmd.SetWarnings True

DoCmd.DeleteObject acTable, "tblNewRealiz"
Me.Requery
ws.CommitTrans

ext:

ws.Close
Set ws = Nothing
Set dbMyDB = Nothing
Set rcdProd = Nothing
Set rcdRealiz = Nothing
Exit Sub

err:
ws.Rollback
GoTo ext

End Sub

или я чегой-то недопонял?
...
Рейтинг: 0 / 0
16.05.2003, 15:14
    #32161872
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Начало транзакции -> Конец транзакции?
Почти правильно
Только удалять записи из tblNewRealiz не нужно, ибо таблицу ты все равно убиваешь.
И еще. Me.Requery и ws.CommitTrans надо бы местами поменять - пока транзакция не закрыта хрен у тебя формочка изменения увидит.
...
Рейтинг: 0 / 0
16.05.2003, 15:17
    #32161877
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Начало транзакции -> Конец транзакции?
И ws.Close не нужен
...
Рейтинг: 0 / 0
16.05.2003, 15:25
    #32161898
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Начало транзакции -> Конец транзакции?
Если рекордсет открывается до BeginTrans, то его лучше закрывать после Commit/Rollback. А если закрывается до, то открывать лучше после BeginTrans.

И нехорошо DoCmd.SetWarnings False, потому что если оно именно в этот момент вылетит на Error, то так и останется SetWarnings False. Лучше вместо DoCmd.RunSQL использовать dbMyDB.Execute, тогда нет необходимости в DoCmd.SetWarnings False, и тогда заодно у меня будет больше уверенности, что эта команда будет включена в транзакцию.
...
Рейтинг: 0 / 0
16.05.2003, 15:36
    #32161912
Senin Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Начало транзакции -> Конец транзакции?
Используй не синтаксис
Код: plaintext
1.
2.
Set dbMyDB = CurrentDb() , а 
Set dbMyDB = ws( 0 )  

Если верить Гетцу DbEgine(0)(0) не одно и тоже Current()

и еще одна ошибка - сперва надо закрывать подчиненые объекты, а затем главный объект

Код: plaintext
1.
2.
3.
4.
5.
Set rcdProd = Nothing 
Set rcdRealiz = Nothing 
Set dbMyDB = Nothing 
ws.Close  'Нужен ws.close - хотя бы для красоты и понятливости кода 
Set ws = Nothing 



Вторая ошибка

Код: plaintext
1.
2.
3.
DoCmd.SetWarnings False 
DoCmd.RunSQL  "DELETE tblNewRealiz.* FROM tblNewRealiz;"  
DoCmd.SetWarnings True 

Эта операция в транзакцию не попадет. Надо чтобы объект ws непосредственно участвовал в транзакции
Например, dbMyDB .Execute "DELETE tblNewRealiz.* FROM tblNewRealiz;" . DoCmd.SetWarnings будет тогда лишним

То что ты делаешь в цикле элементарно делается через SQL-инструкцию "UpDate...Set...", что будет гораздо быстрее.

Ну пока вроде все
...
Рейтинг: 0 / 0
16.05.2003, 15:45
    #32161929
Gri3ly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Начало транзакции -> Конец транзакции?
> То что ты делаешь в цикле элементарно делается через SQL-инструкцию "UpDate...Set...", что будет гораздо быстрее.

дык, это ж я для примера взял кусок какого-то старого кода, первое что попалось...


Всем большое спасибо, очень помогли.
...
Рейтинг: 0 / 0
16.05.2003, 15:53
    #32161946
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Начало транзакции -> Конец транзакции?
2 Сенин Виктор
Разумеется CurrentDB и DBEngine(0)(0) - не одно и то же. Тут даже без Гетца можно обойтись. Сам майкрософт где-то писал, что всякие коллекции (QueryDefs и TableDefs) в первом случае рефрешаться, а во втором - нет. А уж что тебе нужно - тебе решать, хотя в большинстве случаев абсолютно по барабану.
А удалять строки из таблицы, которую саму следующей строкой удаляют - таки не нужно
...
Рейтинг: 0 / 0
16.05.2003, 16:24
    #32161993
Senin Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Начало транзакции -> Конец транзакции?
2 Лоху
>Разумеется CurrentDB и DBEngine(0)(0) - не одно и то же

В хелпе ни слова, в книгах (за исключением Гетца) ни слова;
ссылка же будет на один и тот же объект - текущую базу данных, так откуда возьмется "разумеется"?

>хотя в большинстве случаев абсолютно по барабану.

Барабан был плох,
барабанщик сдох...

>И ws.Close не нужен
Почему? Надежда на корректное уничтожение локальных переменных при входе из области видимости?

З.Ы.
Пора закругляться - короткий день - GoTo Домой
...
Рейтинг: 0 / 0
16.05.2003, 16:39
    #32162021
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Начало транзакции -> Конец транзакции?
2 Сенин Виктор
Объект то один и тот же. Только в случае CurrentDB создается новый экземпляр (и все коллекции автоматом обновляются), а в случае DBEngine(0)(0) - возвращается ссылка на объект из коллекции Workspace.Databases (и все коллекции в нем какими были, такими и остануться)
ws.Close не нужен потому, что все равно ws не закрывается пока на него ссылки есть. А на DBEngine(0) ссылка есть всегда. Та же фигня с ADO.Recordset.
Прочитал это у Гетца и сильно призадумался - зачем же этом метод вообще нужен. Если после Set rs = Nothing ссылок больше нет - закрыться должен сам, а если ссылки есть - все равно не закроется.
...
Рейтинг: 0 / 0
16.05.2003, 16:51
    #32162037
Senin Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Начало транзакции -> Конец транзакции?
2 Лоху

Насчет ws.close - согласен
Насчет Nothing - в принципе, не нужно закрывать Close - у меня это привычка
Но если сделать Close, и не сделать Nothing - будут проблемы.
Поэтому я как маньяк явно закрываю все.
...
Рейтинг: 0 / 0
16.05.2003, 16:58
    #32162051
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Начало транзакции -> Конец транзакции?
Насчет ws.Close - все еще хуже. Его нельзя вызывать (если было Set ws = DBEngine(0))!! Сам объект ws - не закроется, а вот все дочерние объекты (QueryDef, Recordset) - умрут.

Насчет ADODB.Recordset я все-таки продолжаю удивляться. Как-то логично, что если говоришь Close - то рекордсет должен закрыться. А он на тебя положил оказывается... Причем только из-за того, что где-то ссылка висит. Уж лучше бы в этом где-то получилась ссылка на закрытый объект...
...
Рейтинг: 0 / 0
16.05.2003, 17:32
    #32162105
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Начало транзакции -> Конец транзакции?
Во блин, никому верить нельзя... Даже Гетцу...
Только что проверил закрытие ADO-шных рекордсетов - все нормально. Они закрываются несмотря на ссылки. Теперь сомневаюсь в своей памяти. До дома доползу - Гетца на страницы порву, но этот глючный абзац отыщу.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Начало транзакции -> Конец транзакции? / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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