Страница 1 из 1
Как же меня достал этот глюк в LogOut...
Добавлено: 17 Июнь 2025, 13:26
Губин Игорь
При работе с LogOut наблюдается плавающе-постоянный глюк:
Внутри LogOut - Commit ключи в создаваемом файле создаются некорректно. Т.е. запись может быть добавлена (Add), а вот в ключах она не отразилась (Get даёт ошибку)...
В очередной раз наткнулся в старых кодах... Причём это может не проявляться годами, а в какой-то момент на каких-то определённых записях всё ломается.
Как же меня достал этот глюк в LogOut...
Добавлено: 17 Июнь 2025, 14:06
finsoftrz
Ни разу не сталкивался на С6.
Как же меня достал этот глюк в LogOut...
Добавлено: 17 Июнь 2025, 17:13
Губин Игорь
finsoftrz писал(а): 17 Июнь 2025, 14:06
Ни разу не сталкивался на С6.
с10, с11
Как же меня достал этот глюк в LogOut...
Добавлено: 17 Июнь 2025, 17:52
Игорь Столяров
Губин Игорь писал(а): 17 Июнь 2025, 13:26
а вот в ключах она не отразилась (Get даёт ошибку)
Вопрос в том, насколько вообще правомерна такая операция ...
Предположим, я внутри внутри LogOut - Commit добавляю запись с ID = 123
В это время с другой рабочей станции кто-то делает GET(ID = 123) записи.
Скорее всего получится фигвам ...

хотя может зависеть от конкретного драйвера БД.
Как же меня достал этот глюк в LogOut...
Добавлено: 17 Июнь 2025, 17:59
Губин Игорь
Игорь Столяров писал(а): 17 Июнь 2025, 17:52
Вопрос в том, насколько вообще правомерна такая операция ...
Предположим, я внутри внутри LogOut - Commit добавляю запись с ID = 123
В это время с другой рабочей станции кто-то делает GET(ID = 123) записи.
Файл открывается 12h, т.е. никаких посторонних влияний. Работает с файлом единственный процесс
Драйвер TopSpeed
В мануале никаких запретов
Как же меня достал этот глюк в LogOut...
Добавлено: 17 Июнь 2025, 18:43
finsoftrz
Игорь Столяров писал(а): 17 Июнь 2025, 17:52
Губин Игорь писал(а): 17 Июнь 2025, 13:26
а вот в ключах она не отразилась (Get даёт ошибку)
Вопрос в том, насколько вообще правомерна такая операция ...
Предположим, я внутри внутри LogOut - Commit добавляю запись с ID = 123
В это время с другой рабочей станции кто-то делает GET(ID = 123) записи.
Скорее всего получится фигвам ...

хотя может зависеть от конкретного драйвера БД.
Logout буферизует запись в оперативной памяти. В приведенном случае до commit get увидит новую запись только там, где выполняется операция. У всех остальных новые записи не видны, разумеется. Я тоже часто использую logout для ускорения работы. Только режу большие транзакции на порции по 50-100 тыс записей. Все нормально работает. Когда-то давно сталкивался, что если не резать транзакции, то начинало происходить торможение, видимо, своп или что-то подобное. Потом были проблемы с высвобождением памяти. Кто-то рекомендовал запускать очень большие транзакции отдельным exe, чтобы по завершении память возвращалась операционной системе. Это очень давно было. Все сказанное для topspeed, разумеется. В ряде случаев (если, например, мы конвертируем таблицы, то есть полностью создаем новый файл) ускорение дает append вместо add, с последующим build. Для btrieve быстрее было сразу add.
Как же меня достал этот глюк в LogOut...
Добавлено: 17 Июнь 2025, 18:52
Игорь Столяров
finsoftrz писал(а): 17 Июнь 2025, 18:43
Все сказанное для topspeed, то есть ускорение дает append вместо add, с последующим build.
Полностью согласен. Самое интересное, что на больших списках такая схема даёт хороший выигрышь и для драйвера In-Memory.
Как же меня достал этот глюк в LogOut...
Добавлено: 17 Июнь 2025, 19:02
Губин Игорь
finsoftrz писал(а): 17 Июнь 2025, 18:43
Только режу большие транзакции на порции по 50-100 тыс записей. Все нормально работает. Когда-то давно сталкивался, что если не резать транзакции, то начинало происходить торможение, видимо, своп или что-то подобное
Тут о другом речь.
Файл не очень большой, но к нему шло постоянное обращение в процессе его же создания. Когда лимитировал жёсткий диск LogOut очень сильно ускорял процесс.
Дело в том, что ты добавил запись через Add с некоторым уникальным значением поля (единственное в ключе), потом проверил, есть ли запись с таким значением поля, а get сказал - нету, но если добавить ещё одну запись с таким значением, то вылетает по Duplicate.
Код: Выделить всё
AFile File
AKey Key(AField),Primary
Recodd
AField Long
End
End
LogOut (.1,AFile)
AField = 1
Add(AFile)
.....
AField = 1
Get(AFile,AKey)
IF ErrorCode() Then
AFiled = 1
Add(AFile)
IF ErrorCode() <> 0 Then Stop('Что за фигня').
End
Commit
Как же меня достал этот глюк в LogOut...
Добавлено: 17 Июнь 2025, 19:40
finsoftrz
Похоже на баг. Во времена с6 такой вопрос обсуждался, и было сказано, что станция, которая добавляет записи в logout, сама их видит. То есть она делает get по буферу. Я обычно такое не использую, но, если правильно помню, то проверял, работало.
Как же меня достал этот глюк в LogOut...
Добавлено: 17 Июнь 2025, 19:47
Губин Игорь
finsoftrz писал(а): 17 Июнь 2025, 19:40
проверял, работало
Как правило

работает.
