powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / INSERT после BEGIN TRANSACTION?
5 сообщений из 5, страница 1 из 1
INSERT после BEGIN TRANSACTION?
    #32481158
Problem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m.first = 1
m.sysdate = date()
INSERT INTO my_table FROM MEMVAR
BEGIN TRANSACTION
lSuccess = TABLEUPDATE(.T.,.T.,'my_table')
IF NOT lSuccess
ROLLBACK
MESSAGEBOX("Не удалось обновить my_table")
ELSE
END TRANSACTION
ENDIF
GO TOP IN my_table
Так написано в хелпе. Интересно, если вставка не удалась, почему не обертывается транзакцией сам INSERT INTO? Т.е. буфер в таблицу не сброшен и при попытке движения записи (GO TOP IN my_table) выдается ошибка, что правильно. Не нужно ли после ROLLBACK ставить TABLEREVERT для такого случая?
Буду признателен за конструктивные ответы!
...
Рейтинг: 0 / 0
INSERT после BEGIN TRANSACTION?
    #32481171
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем insert обертывать?
Он же делается в буфер...
...
Рейтинг: 0 / 0
INSERT после BEGIN TRANSACTION?
    #32481219
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зависит от конкретной ситуации.

Транзакцией обертывается только команда TableUpdate() для того, чтобы пользователь мог внести изменения в буфер в случае неудачной попытки сохранения. Ну, например, ты набивал 100 полей и сброс не произошел из-за ошибки в одном из них. Что, набивать все 100 полей по новой?

Хотя, в данном случае, конечно, надо включить команду INSERT-SQL внутрь транзакции, поскольку это та модификация на которую пользователь не в силах повлиять.

Обычно ведь не делают явной команды INSERT-SQL. Как правило, модифицируют либо напрямую буфер таблицы, либо Local View. Т.е. вместо редактирования переменных памяти следует редактировать непосредственно буфер таблицы и команда INSERT-SQL оказывается лишней.

Кстати, ошибка у тебя возникает потому, что ты используешь строковую буферизацию. Если использовать табличную буферизацию, то хотя сброса буфера и не произойдет, но ты вполне сможешь перемещаться по записям таблицы.
...
Рейтинг: 0 / 0
INSERT после BEGIN TRANSACTION?
    #32481346
Problem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GO TOP толко, чтобы сдвинуть указатель. Получается так, что TABLEUPDATE отработал .T., а другой польз. не видит новых данных, пока я не сдвину указатель, (UNLOCK, USE IN и т.д.).
...
Рейтинг: 0 / 0
INSERT после BEGIN TRANSACTION?
    #32482093
Cyv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProblemНе нужно ли после ROLLBACK ставить TABLEREVERT для такого случая?
Обязательно. Штатный режим.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
m.first =  1  
m.sysdate = date() 
INSERT INTO my_table FROM MEMVAR 
BEGIN TRANSACTION 
lSuccess = TABLEUPDATE(.T.,.T.,'my_table') 
IF NOT lSuccess 
ROLLBACK
=TABLEREVERT(.F.,'my_table')
MESSAGEBOX( "Не удалось обновить my_table" ) 
ELSE 
END TRANSACTION 
ENDIF 
GO TOP IN my_table

Если в транзакции обновлялось несколько курсоров (что и является главным её назначением), то соотв. и реверт нужен для каждого, те что-то типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
m.first =  1  
m.sysdate = date() 
INSERT INTO my_table FROM MEMVAR 
BEGIN TRANSACTION 
lSuccess = TABLEUPDATE(.T.,.T.,'my_table') AND TABLEUPDATE(.T.,.T.,'my_child_table')
IF NOT lSuccess 
ROLLBACK
=TABLEREVERT(.F.,'my_child_table')
=TABLEREVERT(.F.,'my_table')
MESSAGEBOX( "Не удалось обновить my_table" ) 
ELSE 
END TRANSACTION 
ENDIF 
GO TOP IN my_table

Вроде так.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / INSERT после BEGIN TRANSACTION?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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