Transaction | |
---|---|
Олег_атор Автор Сообщений: 76 Дата регистрации: 05.09.2000 |
Каким образом узнать были ли изменения с начала транзакции не прощупавая поля
Что-то типа " empty(BUFFER) " |
RE: Transaction | |
---|---|
ВладимирМ Сообщений: 14100 Откуда: Москва Дата регистрации: 02.09.2000 |
Попробуй анализировать блокировку записей. Дело в том, что если запись была изменена внутри транзакции, то она автоматически блокируется до завершения транзакции.
|
RE: Transaction | |
---|---|
SpyFox Сообщений: 27 Дата регистрации: 07.09.2000 |
Вообще считатется плохим тоном в программировании использовать длительные транзакции, т.е., например, начинать транзакцию при открытии формы и завершать при ее закрытии. Оптимальный вариант считается открытие таблиц с Buffering=5, а при записи запускать транзакцию если функция getfldstate обнаруживает изменения в таблицах.
|
RE: Transaction | |
---|---|
ВладимирМ Сообщений: 14100 Откуда: Москва Дата регистрации: 02.09.2000 |
Я бы добавил, что это не просто плохой тон, а ситуация чреватая зависанием при работе в сетевом режиме. Поэтому, чем меньше (по времени) транзакция, тем меньше вероятность зависания в связи с конфликтами обновления несколькими пользователями одной записи.
|
RE: Transaction | |
---|---|
Олег_атор Автор Сообщений: 76 Дата регистрации: 05.09.2000 |
Небольшое уточнение !
С транзакцией я вроде уяснил -- это типа "спасательного круга" перед внесением изменений в таблицы базы Проверять блокировки записей -- это неразумно -- можно всю оставшуюся жизнь бщегать по записям и смотреть какая заблокирована НО КАК ОДНОЙ ФУНКЦИЕЙ ПРОВЕРИТЬ ЕСЛИ ИЗМЕНЕНИЯ В ТАБЛИЦЕ ПРИ БУФФЕРИЗАЦИИ (имеется в виду - правильно и эффективно) -- НЕПОНЯТНО ! |
RE: Transaction | |
---|---|
ВладимирМ Сообщений: 14100 Откуда: Москва Дата регистрации: 02.09.2000 |
Встречный вопрос: А зачем?
Если никаких изменений не было, то по командам END TRANSCTION и(или) TABLEUPDATE() ничего и не будет записано. Заметь (!), они не перезаписывают неизмененные значения, а НИЧЕГО не записывают. |
RE: Transaction | |
---|---|
SpyFox Сообщений: 27 Дата регистрации: 07.09.2000 |
Вот так можно проверить если изменения в буфферизованной таблице.
lParameters lpAlias Local nWorkArea,bool if not empty(lpAlias) nWorkArea=select() select (lpAlias) endif if isnull(getfldstate(-1)) bool=.f. else bool=('2' $ getfldstate(-1) or '4' $ getfldstate(-1)) endif if not empty(nWorkArea) select(nWorkArea) endif retu bool функциия возвращает True, если есть изменения |
RE: Transaction | |
---|---|
Sergey Titow Сообщений: 2242 Дата регистрации: 12.09.2000 |
See Also: GETNEXTMODIFIED(nRecordNumber [, cTableAlias | nWorkArea])
|
RE: Transaction | |
---|---|
Олег_атор Автор Сообщений: 76 Дата регистрации: 05.09.2000 |
Спасибо ! Я уже разобрался и полность удовлетворен.
Для тех кто залезит сюда позже почитать отмечу еще одну особенность: после добавления новой записи в буфферизированную таблицу до тех пор пока небыло tableupdate() или tablerevert() -- функция recno() для новых записей возвращает ОТРИЦАТЕЛЬНЫЕ ЗНАЧЕНИЯ . те. можно и так set order to go bottom if recno()<0 * были изменения endif |
© 2000-2024 Fox Club  |