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

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

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

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

И нехорошо DoCmd.SetWarnings False, потому что если оно именно в этот момент вылетит на Error, то так и останется SetWarnings False. Лучше вместо DoCmd.RunSQL использовать dbMyDB.Execute, тогда нет необходимости в DoCmd.SetWarnings False, и тогда заодно у меня будет больше уверенности, что эта команда будет включена в транзакцию.
...
Рейтинг: 0 / 0
Начало транзакции -> Конец транзакции?
    #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
Начало транзакции -> Конец транзакции?
    #32161929
Gri3ly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> То что ты делаешь в цикле элементарно делается через SQL-инструкцию "UpDate...Set...", что будет гораздо быстрее.

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


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

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

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

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

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

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

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

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


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