VVD
Дата: 18.05.2011 13:12:14
Здравствуйте.
Давненько уже не пишу баз даних и, посему, далече отстал в этом вопросе. Но грехи давние изредка напоминают о себе. Отозвался клиент с моей старой складской прогой IB6+D6+MIDAS+DBExpress. Ни особых объемов данных, ни особой активности пользователей не предвиделось, посему - что оплата, что качество проги были соответствующими :). Но клиент за десяток лет не только не "умер", а неплохо поднялся в производстве продукции и прога стала нарастающим темпом барахлить. При одновременной работе нескольких пользователей время от времени умирает (виснет) сервер IB. Однозначно проблемы со взаимоблокировками вследствие общего увеличения среднего времени выполнения всех транзакций. Повспоминал-потыкал-нашел блудницу транзакцию с таблицей количества товара, которую пользователям нужно одновременно активно править и соответственно на ней все взаимоблокируется . В надежде на крови поменьше поменял IB на FB 2.0 - неа - халявы нет. Поднял изоляцию TSQLConnection этой транзакции до xilREPEATABLEREAD (полной сериализации в компоненте нет) - мало. Понял, что нужно резервировать одну из таблиц на запись. И вот здесь знания кончились. TSQLConnection.StartTransaction резервирования не предполагает. Надо давать прямую команду SET TRANSACTION ... RESERVING... в TSQLConnection.execute. Отсюда начиная вопросы:
1. TSQLConnection.execute('SET TRANSACTION... ' заменит штатный TSQLConnection.StartTransaction... ?
2. Тогда Commit тоже подавать через .execute('commit') или штатным TSQLConnection.commit?
3. Может это все как-то иначе (чтобы поменьше код ворошить) можно сделать?
P.S. В собственной отсталости уже осведомлен - посему прошу со мной как-то попроще и помягче :)
RENaissance
Дата: 18.05.2011 13:35:44
В виду того, что "ничего не помню, ничего не знаю", надо нанимать программиста.