powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Транзакция здорово тормозит программу.
17 сообщений из 17, страница 1 из 1
Транзакция здорово тормозит программу.
    #32782686
Benzin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аксесс97. Сетевая база.
В одной из программ запуск серии запросов на обновление организовал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
DBEngine.Workspaces( 0 ).BeginTrans
'процедура выполнения запроса, возвращающая 0 при успехе
If ВыполнитьЗапрос("Запрос1") = 0  Then
..............................................
      If ВыполнитьЗапрос("ЗапросN) =0 Then
         DBEngine.Workspaces(0).CommitTrans
         Me!Форма1.Requery
      Else
         MsgBox "Ошибка!"
         DBEngine.Workspaces(0).Rollback
Else
   MsgBox "Ошибка!"
   DBEngine.Workspaces( 0 ).Rollback
End If
Если это запустить, то на форме появляется значек блокировки записи и все..., а дальше запись может измениться, а может и нет, причем знак блокировки можно убрать только перезагрузив базу.
В ошибку процедура не сваливается(проверял).
Если убрать вообще транзакцию, то все летает и блокировка не появляется.
Ест-нно пользователь просит убрать эти прибамбасы с откатами, ему удобство важнее. А т.к. этих запросов на изменение в серии несколько и срабатывать они должны по принципу "все или ни один", то приходится рисковать, работая без откатов. Золотая середина есть?
...
Рейтинг: 0 / 0
Транзакция здорово тормозит программу.
    #32782766
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не надо так открывать транзакцию - Акс так почему-то не понимает
(на форуме это вроде было)

Делай так:

Код: plaintext
1.
2.
3.
4.
5.
6.
Dim db as DateBase
Set db = DBEngine.Workspaces( 0 )
db.BeginTrans

....

db.CommitTrans
...
Рейтинг: 0 / 0
Транзакция здорово тормозит программу.
    #32782771
ЛП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
папаримский, ты чему людей учишь?
у датабазы нету метода BeginTrans
сей метод есть у воркспейса

кстати, все аксес понимает. у меня по крайней мере всегда понимал.
...
Рейтинг: 0 / 0
Транзакция здорово тормозит программу.
    #32782787
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛПпапаримский, ты чему людей учишь?
у датабазы нету метода BeginTrans
сей метод есть у воркспейса

кстати, все аксес понимает. у меня по крайней мере всегда понимал.

Пардона прошу - заработался БЛИН!!!

Действительно не воркспасе

Но вот про понимает - это надо проверять (у мну не работает - Акс 97)

Типа пример из хелпа (кстати в примере тоже не работают на прямую!!!):
авторВ следующем примере в таблице «Сотрудники» изменяются названия должностей всех сотрудников, являющихся представителями. Метод BeginTrans начинает транзакцию, изолирующую все изменения в таблице «Сотрудники», а метод CommitTrans сохраняет внесенные изменения. Метод Rollback служит для отмены изменений, сохраненных с помощью метода Update. В примере также показано, как установить флаг для корректной обработки ошибок, возникающих во время транзакции.

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

Sub ChangeTitle()
Dim wsp As Workspace, dbs As Database, rst As Recordset
Dim strName As String, strMessage As String, strPrompt As String
Dim fInTrans As Boolean

On Error GoTo ChangeTitleErr

fInTrans = False
strPrompt = "Изменить должность на 'Менеджер по продажам'?"
' Возвращает ссылку на заданный по умолчанию объект Workspace.
Set wsp = DBEngine.Workspaces(0)
' Возвращает ссылку на текущую базу данных.
Set dbs = CurrentDb
' Создает табличный объект Recordset.

Set rst = dbs.OpenRecordset("Сотрудники", dbOpenTable)
' Начало транзакции.
wsp.BeginTrans
fInTrans = True
rst.MoveFirst
Do Until rst.EOF
If rst!Должность = "Представитель" Then
strName = rst!Фамилия & ", " & rst!Имя
strMessage = "Сотрудник: " & strName & vbCrLf & vbCrLf
If MsgBox(strMessage & strPrompt, vbQuestion + vbYesNo, _
"Изменить должность") = vbYes Then
' Разрешает редактирование.
rst.Edit

rst!Должность = "Менеджер по продажам"
' Сохраняет изменения.
rst.Update
End If
End If
' Переходит к следующей записи.
rst.MoveNext
Loop
If MsgBox("Сохранить все изменения?", vbQuestion + vbYesNo, _
" Сохранение изменений") = vbYes Then
wsp.CommitTrans ' Принимает изменения.
Else
wsp.Rollback ' Отменяет изменения.
End If
ChangeTitleExit:
rst.Close
Set dbs = Nothing

Set wsp = Nothing
Exit Sub
ChangeTitleErr:
MsgBox "Ошибка!"
If fInTrans Then
wsp.Rollback
End If
Resume ChangeTitleExit
End Sub
...
Рейтинг: 0 / 0
Транзакция здорово тормозит программу.
    #32782800
ЛП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в примере из хелпа ссылка на DBEngine(0) сохраняется в отдельную переменную типа Workspace. Ну и чудненько, ну и славненько. Однако и без сохранения ссылки - все все равно работает. Я всю жизнь пользовался именно таким синтаксисом - DBEngine(0).BeginTrans и DBEngine(0).CommitTrans

Есть случаи, когда без явного сохранения не пашет то, что по идее должно пахать, например работа с TableDefs, но это не тот случай.
...
Рейтинг: 0 / 0
Транзакция здорово тормозит программу.
    #32782805
ЛП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, можно писать и так:
Код: plaintext
1.
DBEngine.BeginTrans
DBEngine.CommitTrans
и так тоже можно писать:
Код: plaintext
1.
BeginTrans
CommitTrans
дело вкуса. хотя мне больше нравится способ с сохранением ссылки :)
...
Рейтинг: 0 / 0
Транзакция здорово тормозит программу.
    #32782820
Benzin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да я пробовал и ссылку сохранять, и так, и эдак - при работе в сети, то и дело программа "задумывается" и надолго, а чаще - мертво вешает блокировку на запись.
А вот если перетащить серверную часть на локал - транзакция работает.
...
Рейтинг: 0 / 0
Транзакция здорово тормозит программу.
    #32782824
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все понял - был не прав

Молчу - молчу - молчу

ЗЫ: Но лучше (ИМХО) ссылки всегда сохранять, чтобы не наступить на очередные грабли от мелкомягких!
...
Рейтинг: 0 / 0
Транзакция здорово тормозит программу.
    #32782865
Benzin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а мне-то как выпутаться?
...
Рейтинг: 0 / 0
Транзакция здорово тормозит программу.
    #32782868
ЛП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BenzinНу а мне-то как выпутаться?
Наверное надо показать текст функции "ВыполнитьЗапрос"
...
Рейтинг: 0 / 0
Транзакция здорово тормозит программу.
    #32782901
Benzin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
Function ВыполнитьЗапрос(strNameQuery As String, strSqlQuery As String, ParamArray varParam() As Variant) As Integer
On Error GoTo Err_ВыполнитьЗапрос

Dim intI As Integer
Dim qd As QueryDef

If strSqlQuery <> "" Then
    Set qd = CurrentDb().CreateQueryDef("", strSqlQuery)
Else
    Set qd = CurrentDb.QueryDefs(strNameQuery)
End If

    For intI =  0  To UBound(varParam())
        qd.Parameters(intI) = Nz(varParam(intI), "")
    Next intI

qd.Execute dbFailOnError
intRunQueryWParam =  0 

Set qd = Nothing
ВыполнитьЗапрос_EXIT:
    Exit Function

RunQueryWParametr_ERR:
Select Case err.Number
Case  3265 
Resume Next
Case Else
MsgBox "Ошибка #: " & err.Number & err.Description
ВыполнитьЗапрос = err.Number

   Resume ВыполнитьЗапрос_EXIT
End Select

Exit_ВыполнитьЗапрос:
    Exit Function

Err_intRunQueryWParam:
    MsgBox err.Description
    Resume Exit_ВыполнитьЗапрос
End Function
...
Рейтинг: 0 / 0
Транзакция здорово тормозит программу.
    #32783837
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может тормоза из за того что меняется структура базы (создание запроса) внутри транзакции и накладывается что то типа блокировки структуры ...

может попробовать что то типа runsql или пробовать
ado currentproject.connection и его транзакции и execute
...
Рейтинг: 0 / 0
Транзакция здорово тормозит программу.
    #32784882
Benzin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлексейК ado currentproject.connection и его транзакции и execute... ага, но только сначала переписать всю программу с А97 на ...
...
Рейтинг: 0 / 0
Транзакция здорово тормозит программу.
    #32784921
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще б 2 аксесс вспомнили ....
я уже забыл этого зверя как страшный сон.
...
Рейтинг: 0 / 0
Транзакция здорово тормозит программу.
    #32784945
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Benzin
А вот если перетащить серверную часть на локал - транзакция работает.

Рой в сторону настроек сети (если новелл - то ключи серверные на количество одновременно открытых-чего-то-там... - всего 4 ключа, кажисть ReсordLocksPer... - т.е. - на юзера| всего| на транзакцию| и еще на что - то).


Нароешь еще причины - расскажи (тоже тормоза наблюдаю периодически при переходе на более крутое серверное железо ). Причем не открываю (почти) транзакций сам.
...
Рейтинг: 0 / 0
Транзакция здорово тормозит программу.
    #32784984
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлексейКеще б 2 аксесс вспомнили ....
я уже забыл этого зверя как страшный сон.

ага, не дале как с недели 2 взад пришлось переписвать ранее годами работавший запрос такому вот "зверю" - длина отобранной записи (в зависимости от данных, а не от запроса) приводит зверя к заключению "слишком сложный запрос".

Но, собака, открывается на порядок шустрее 97 (и реже валится в системные ошибки). Т.ч., чую, придется еще поподдерживать не переводя.
...
Рейтинг: 0 / 0
Транзакция здорово тормозит программу.
    #32785180
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу приведенной функции ВыполнитьЗапрос
Присоветовал бы для начала следующее
Фаза 0
В предположении, что внешние транзакционные скобки сохраняются
А) жестко избавиться от CurrentDB внутри функции, либо заменив на
DBEngine(0)(0), либо передавая переменную типа Database как параметр
функции,
Б) Жестко избавиться от CreateQueryDef при каждом вызове с пустым именем
запроса, заменив либо на один статический QueryDef в функции с проверкой
на ничто, либо на переменную уровня модуля.
В) QueryDefs я бы тоже прокешировал в локальную переменную…
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Транзакция здорово тормозит программу.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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