powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Использование транзакций
18 сообщений из 18, страница 1 из 1
Использование транзакций
    #32715726
Levran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня следующий вопрос: имеется исходный код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
begin transaction
     insert into table1 <что-то> 
     insert into table2 <что-то> 
     replace <что-то> table3
     if <replace не отработал>
           rollback
     endif
end transaction
Я проверяю как отработал replace. Если замены в таблице не было(например она заблокирована другим пользователем), делаю rollback, иначе завершаю транзакцию. Нужно ли мне проверять результаты работы insert, ведь при его работе вроде автоматически блокируется таблица и вставка записи должна происходить 100%, или я не прав?
...
Рейтинг: 0 / 0
Использование транзакций
    #32715865
SergeyPl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Вашем случае не надо. На то она и транзакция, чтобы откатить все операции, которые в нее включены.
...
Рейтинг: 0 / 0
Использование транзакций
    #32715881
Levran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SergeyPlВ Вашем случае не надо. На то она и транзакция, чтобы откатить все операции, которые в нее включены.

Это понятно, но если replace отработал, а insert нет, я ведь не проверяю результат вставки. Вопрос в том, нужно ли его проверять!
...
Рейтинг: 0 / 0
Использование транзакций
    #32716433
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В таком контексте нужна проверка корректного завершения каждой команды модификации.

-) INSERT-SQL может НЕ выполнить вставку (много причин), как следствие, REPLACE будет выполнен не туда
-) Собственно REPLACE может НЕ выполнить модификацию (тоже много причин)

Т.е. вопрос даже не в блокировках (хотя тоже есть опасность "мертвых" блокировок, но для этого есть SET REPROCESS), а в корректности выполнения команд.

Обычно для модификации используют буферизацию:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CursorSetProp("Buffering", 5 ,"Table1")
CursorSetProp("Buffering", 5 ,"Table2")
insert into table1 <что-то> 
insert into table2 <что-то> 
replace <что-то> table3
BEGIN TRANSACTION
IF TableUpdate(.T.,.T.,"table1") AND TableUpdate(.T.,.T.,"table2")
	END TRANSACTION
ELSE
	ROOLBACK
	* Анализ причины ошибки по AERROR()
ENDIF

Это, кончено, всего-лишь общая схема. Но суть именно в этом: модификация - в собственно буфере, а потом разовый сброс буфера.

Разрешение конфликтов совместного доступа сведено к одному программному узлу (TableUpdate()). А при выполнении собственно команд модификации надо следить только за ошибками корректной модификации данных и уже не обращаешь внимания на проблемы совместного доступа.
...
Рейтинг: 0 / 0
Использование транзакций
    #32716485
Levran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тогда наверное имеет смысл включить буферизацию и для третьей таблицы (в которой выполняется replace). В этом случае даже не надо проверять старое значение и новое, чтобы определить выполнился ли replace. Потому что все моменты связанные со сбросом буфера в таблицу берет на себя FoxPro (читай функция TableUpdate()). Так?
...
Рейтинг: 0 / 0
Использование транзакций
    #32716505
Levran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И вообще, насколько эффективно с точки зрения безопасности и надежности использование транзакции в FoxPro? Не проще ли старым дедовским методом: блокирую все таблицы, вставляю, снимаю блокировку... Понятно, что делать я так не буду, но всё-таки хочется услышать Ваше мнение. Все дело еще в том, что блокировать "надолго" записи у меня возможности (есть свои причины), именно вследствии этой причины я и пришел к использованию транзакции, хотя не очень уверен в обоснованности ее использования.
...
Рейтинг: 0 / 0
Использование транзакций
    #32716748
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LevranТогда наверное имеет смысл включить буферизацию и для третьей таблицы (в которой выполняется replace).
Ну, да, буферизировать надо все таблицы, которые собственно модифицируются. Хотя, возможны исключения из этого правила в конкретной задаче.

LevranВ этом случае даже не надо проверять старое значение и новое, чтобы определить выполнился ли replace. Потому что все моменты связанные со сбросом буфера в таблицу берет на себя FoxPro (читай функция TableUpdate()). Так?
Не совсем. При буферизации нет никакого контроля на значение данных. Проверяется сам факт модификации данных. Но ведь вполне возможно, что пользователь изменил какое-то поле, а потом спохватился и вернул старое значение. При этом, хотя поле было модифицировано, но его значение по сути не изменилось. Если для Вас это имеет принципиальное значение, то такую ситуацию следует дополнительно контролировать.

LevranИ вообще, насколько эффективно с точки зрения безопасности и надежности использование транзакции в FoxPro?
Насколько эффективно и безопасно работать с таблицами DBF? Вопрос того же уровня.

LevranНе проще ли старым дедовским методом: блокирую все таблицы, вставляю, снимаю блокировку... Понятно, что делать я так не буду, но всё-таки хочется услышать Ваше мнение.
Суть транзакции - это внесение изменений по принципу "Все или ничего". Т.е. либо ВСЕ изменения будут внесены в базу данных, либо не будет внесено НИКАКИХ изменений.

Если жы Вы будете работать без транзакции через блокировку таблиц, то пондобиться самостоятельно писать код по откату внесенных изменений, если, например, в первую таблицу внесли изменения, а во вторую не удалось. Или не изменились часть записей в одной таблице.

LevranВсе дело еще в том, что блокировать "надолго" записи у меня возможности (есть свои причины), именно вследствии этой причины я и пришел к использованию транзакции, хотя не очень уверен в обоснованности ее использования.
Не совсем понял: Вы можете или нет блокировать запись "надолго"?

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

В режиме оптимистической буферизации таблиц (5), один пользователь может сколь угодно долго производить модификацию своего буфера при этом никак не мешая другому пользователю модифицировать те же самые данные.

Блокировка данных будет производится только в момент сброса изменений (по TableUpdate()). В это же время производится и разрешение конфликтов совместного доступа. Если действительно была модификация одних и тех же данных (второй параметр в команде TableUpdate()+AERROR()- код ошибки 1585)
...
Рейтинг: 0 / 0
Использование транзакций
    #32717821
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ВладимирМ

К сожалению при прямой работе с таблицами даже буферизация не будет
панацеей - ибо часть операций проверки будет сделана ДО сброса буфера.
Именно к вставке это и относится в первую очередь. Среди проводимых
проверок - проверка уникальности индексов.
Введение ещё одного уровня косвенности - локальных представлений - решает
большинство проблем IMHO.

Posted via ActualForum NNTP Server 1.0
...
Рейтинг: 0 / 0
Использование транзакций
    #32719383
Levran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ
Обычно для модификации используют буферизацию:

Далее вы пишите, что нужно включить оптимистическую блокировку таблиц.
Код: plaintext
1.
CursorSetProp("Buffering", 5 ,"Table2")
Объясните пожалуйста, как будет работать транзакция, если я открою таблицу с пессимистической блокировкой?
Код: plaintext
1.
CursorSetProp("Buffering", 4 ,"Table2")
...
Рейтинг: 0 / 0
Использование транзакций
    #32719460
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Буферизация и транзакция - это 2 разных процесса. Выбор типа буферизации никак не может повлиять на логику работы транзакции.

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

Отличие оптимистической буферизации от пессимистической заключается в моменте установки блокировки на редактируемые данные.

При оптимистической буферизации в процессе редактирования буфера данные остаются НЕ заблокированными. Блокировка осуществляется только в момент сброса буфера (например, по команде TableUpdate()).

Как следствие, одни и те же данные в режиме оптмистической буферизации одновременно могут редактировать несколько пользователей. "Разбор полетов", т.е. чьи же изменения следует записать в базу данных осуществляется в момент попытки сброса буфера.

При пессимистической буферизации данные блокируются в момент начала их модификации. Блокировка снимается в момент сброса буфера.

Как следствие, если один пользователь начал редактирование данных, то другой уже не сможет начать редактирование пока первый пользователь их не закончит. Однако попытка второго пользователя начать модификацию вызовет сообщение об ошибке (108 или 109), которую необходимо будет перехватить и обработать.

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

Если опустить чисто психологическую проблему (пользователь желает редактировать, а его не пускают), то проблема в том, что блокировка данных - это технически опасный момент. В том смысле, что сбой питания или обрыв соединения в этот момент может привести к порче структуры таблицы (но может и НЕ привести. Как повезет). Более опасным в этом смысле является только прямое редактирование данных неопределенно долгое время.
...
Рейтинг: 0 / 0
Использование транзакций
    #32719467
&&&&&
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 ВЛАДИМИРМ

==Как следствие, одни и те же данные в режиме оптмистической буферизации ==одновременно могут редактировать несколько пользователей. "Разбор ==полетов", т.е. чьи же изменения следует записать в базу данных ==осуществляется в момент попытки сброса буфера.

А НЕ ПОДСКАЖЕТЕ ЛИ ПО-КОНКРЕТНЕЙ НАСЧЕТ РАЗБОРКИ ПОЛЕТОВ...
ИМХО - если НЕ разбирать их - то в базу запишутся данные того, кто последний нажал СОХРАНИТЬ...
Но ведь это порой не хорошо... как быть тогда?
...
Рейтинг: 0 / 0
Использование транзакций
    #32719492
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
&&&&&
А НЕ ПОДСКАЖЕТЕ ЛИ ПО-КОНКРЕТНЕЙ НАСЧЕТ РАЗБОРКИ ПОЛЕТОВ...
ИМХО - если НЕ разбирать их - то в базу запишутся данные того, кто последний нажал СОХРАНИТЬ...
Но ведь это порой не хорошо... как быть тогда?
Посмотрите парой постов выше:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
IF TableUpdate(.T.,.F.)=.F.
	LOCAL laError( 1 )
	=AERROR(laError)
	IF laError[ 1 , 1 ]= 1585 
		* Пока Вы редактировали данные другой пользователь 
		* изменил те же самые данные. Писать поверх?

		* Если решили писать поверх:
		TableUpdate(.T.,.T.)
	ENDIF
ENDIF

Это, опять же, только схема. Если сброс буфера окружен транзакцией, то перед запросом к пользователю надо отменить транзакцию (ROOLBACK) и заново начать весь процесс, если пользователь захотел писать поверх изменений другим пользователем.

Ни в коем случае нельзя оставлять "подвешенную" тарнзакцию на момент ожидания реакции пользователя!

Впрочем, прежде чем писать такую обработку, неплохо бы оценить, насколько в конкретной задаче запись поверх изменений другого пользователя будет критична.
...
Рейтинг: 0 / 0
Использование транзакций
    #32719517
Levran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может подскажите, где хранится буфер транзакции. Локально? В dbc? И где найти документальное подтверждение этому...
...
Рейтинг: 0 / 0
Использование транзакций
    #32719635
XAndy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторМожет подскажите, где хранится буфер транзакции. Локально? В dbc? И где найти документальное подтверждение этому...

В dbc. Там есть запись ObjectName="TransactionLog", в одном из memo-полей этой записи ИМХО и хранится журнал транзакций.
...
Рейтинг: 0 / 0
Использование транзакций
    #32720973
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 XAndy

Я сомневаюсь что там что-то хранится, и тем более что фокс реально ведёт
полноценный "лог транзакции". Я думаю что тут всё попроще будет. Как доводы:
Открытие dbc в режиме NOUPDATE не мешает транзакции, Просмотр этого поля dbc
в другой сессии во время специально подвешенной транзакции ничего не
показывает, равно как и просмотр в той-же сессии (USE database.dbc SHARED
AGAIN IN 0 ALIAS tmpDB), введение в VFP9 транзакций для free-таблиц.
Как я понимаю вся информация вплоть до ROLLBACK/END TRANSACTION хранится
исключительно в памяти фокса, и при сбоях просто пропадает.
Вообще транзакции фокса существенно отличаются от транзакций других
СУБД. Это факт.

Posted via ActualForum NNTP Server 1.0
...
Рейтинг: 0 / 0
Использование транзакций
    #32721047
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то Ken Levy заявил, что в VFP пока не планируется вводить полноценную базу данных в качестве источника данных. Но если кому надо - то есть MS SQL Server (2Gb бесплатно - остальное за деньги ) Так что естественно транзакции в VFP не совсем надежны.

Хотя все познается в сравнении - выдерните провод питания из сервера SQL при большой загрузке - и Вы поймете, что нет в жизни совершенства Но это уже в другой раздел этого уважаемого форума - могу подсказать ключевые слова для поиска - "База упала/слетела/исчез transaction log e.t.c."...
...
Рейтинг: 0 / 0
Использование транзакций
    #32722104
Levran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В умной книжке Рода Пэддока "VFP 6. Разработка корпоративных приложений" написано
Пэддок
...VFP использует протокол транзакций, но не создаёт для этого отдельной таблицы...
Может кто подскажет, можно ли сохранить этот протокол, или хотя бы посмотреть его в момент выполнения....
...
Рейтинг: 0 / 0
Использование транзакций
    #32723066
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Levran

Штатных средств точно нету, про недокументированные я ничего не знаю. В
общем маловероятно что ты найдёшь где-то решение. Скорее всего для этого
надо залазить в память фокса, ковыряться в его внутренних структурах, и т.п.

Posted via ActualForum NNTP Server 1.0
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Использование транзакций
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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