On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение



Пост N: 26
Зарегистрирован: 30.01.18
ссылка на сообщение  Отправлено: 15.11.23 13:23. Заголовок: Dbcommit()


Никогда не использовал в Харборе функцию Dbcommit(), так как где то читал плюс подтвердил сам это опытным путем, что в Харборе данные сами свопируются на диск и видны другим пользователям.
Но недавно пришлось изучать чужой код где при групповой обработке данных Dbcommit() идет после каждого добавления/обновления записи, что страшно тормозит процесс.
Есть ли в этом какой то сакральный смысл или это все таки аттавизм Клиппера?

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 7 [только новые]


moderator




Пост N: 2217
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 15.11.23 13:46. Заголовок: NickSam пишет: Есть..


NickSam пишет:

 цитата:
Есть ли в этом какой то сакральный смысл


Смысл состоит в принудительной записи буферов с данными на диск.
Ниже см. тестовый пример:
REQUEST DBFCDX 


FUNCTION MAIN()

LOCAL cDbf := "MYTEST.DBF"

RDDSETDEFAULT( "DBFCDX" )

SET EXCLUSIVE OFF

//SET HARDCOMMIT OFF

DBCREATE( cDbf, { { "TEST", "C", 30, 0 } } )

? FILEDATE( cDbf ), FILETIME( cDbf )

INKEY( 2 )

USE ( cDbf )

APPEND BLANK

REPLACE FIELD -> test WITH "TEST"

COMMIT

? FILEDATE( cDbf ), FILETIME( cDbf )

INKEY( 0 )

RETURN NIL

Попробуй закомментировать строку с командой COMMIT и сравни результаты работы (как изменяется дата и время изменения базы).

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 27
Зарегистрирован: 30.01.18
ссылка на сообщение  Отправлено: 15.11.23 15:20. Заголовок: Григорий, да в Вашем..


Григорий, да в Вашем примере все четко работает. Без COMMIT время файла не меняется и данные не пишутся в файл.
Но если сделать вот такую конструкцию:
if rlock()
REPLACE FIELD -> test WITH "TEST"
dbunlock()
endif
, то данные пишутся в файл (хотя время файла не меняется).
Если сюда добавить Dbcommit(), то при групповой обработке данных скорость падает на порядок.
Вот у меня и возник вопрос, нужен ли он если данные все равно пишутся на диск в файл.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1686
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 15.11.23 15:39. Заголовок: NickSam пишет: Если..


NickSam пишет:

 цитата:
Если сюда добавить Dbcommit(), то при групповой обработке данных скорость падает на порядок.


Можно commit делать не в каждой итерации групповой обработки, а в конце. Всё ж споконЕй))

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4449
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.11.23 15:40. Заголовок: NickSam пишет нужен ..


NickSam пишет
 цитата:
нужен ли он если данные все равно пишутся на диск в файл


Все зависит от работы вашего приложения и от исп. данных. Если это одно раб. место и оно пишет читает, считает ... в единственном экземпляре, то dbCommit важен только для целостности базы, т.е. при обрыве электричества, нажатия выкл. в момент работы пользователем. Если у вас сетевая работа и исп. деньги и др. единицы материального учета в online режиме и в разных таблицах, документы, итоги, проводки ..., то без dbCommit или перемещения по базе (skip, goto ... тоже скидывают данные из буфера) будет рассогласование данных в получаемых отчетах на разных раб. местах.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 28
Зарегистрирован: 30.01.18
ссылка на сообщение  Отправлено: 15.11.23 16:18. Заголовок: SergKis пишет: буде..


SergKis пишет:

 цитата:
будет рассогласование данных в получаемых отчетах на разных раб. местах


Поставил эксперимент. Обновляю запись, делаю dbunlock() без Dbcommit(), перемещений по базе нет. Обновленная запись видна другому пользователю.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 4136
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 15.11.23 16:38. Заголовок: Вопрос с dbCommit я ..


Вопрос с dbCommit я решал лет тридцать назад, с тех пор ставлю на автомате после любого обновления, или в конце группового. Лучше пусть будет медленнее, но надежнее
А уже более 10 лет пользуюсь исключительно letodb за редким исключением, а там dbCommit - это передача данных с клиента на сервер, что почти одно и то же.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4450
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.11.23 16:40. Заголовок: NickSam Не спорю, н..


NickSam
Не спорю, но RDD имеет свой буфер, windows свой, на нескольких PC все повторяется, у PC сервера свое.
Когда буфер из RDD ляжет на диск без dbCommit, я не скажу. А вам принимать решение, надо экономить время или нет с dbCommit

 цитата:
Обновляю запись, делаю dbunlock() без Dbcommit(), перемещений по базе нет


dbUnlock содержит скрытый типа dbSkip(0), с перечитыванием записи

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 252
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет