Здравствуйте форумчане. Задача у меня следующая:
1) есть база данных, есть клиентское приложение
2) в клиентском приложении редактируются некие объекты (сущности) из базы данных
3) для оптимизации работы клиента, да и сервера (из-за чего собственно весь сырбор), данные об объектах с сервера подгружаются не все сразу (можно представить что база - это некий документ или конфигурация), а только по мере необходимости и могут храниться в памяти клиента уже в измененном виде
4) а теперь самое интересное: иногда клиенту нужно видеть полную картину редактируемой базы, то есть как-то слепить данные с сервера со своми еще не сохраненными
Я смекнул, что можно сделать так: начать транзакцию, сохранить в ней редактируемые объекты, сделать выборку по всей базе объектов, потом после получения информации клиентом отменить изменения, но наткнулся в хелпе на то, что незаккоммиченные данные в Posgres'е читать нельзя, потом написал этот вопрос Вам:
Можно ли отменить транзакцию уже после коммита, чтобы все были счасливы?
ps Если нет, то я наверно очень расстроюсь почем зря.
Мракобесие полное то, что вы
Мракобесие полное то, что вы пишите.
Во-первых, конечно же нельзя! ROLLBACK это отмена транзакции ДО выполнения COMMIT.
Во-вторых, те 4-ре пункта что вы написали - это тихий ужас. Нельзя так работать. Выход из строя клиента (который по определению не так надёжен как сервер) приведёт к потере уже изменённых данных! Таким образом вся клиент-серверная архитектура опошляется.
Не понимаю, что вам мешает подгружать только нужные данные и сохранять только изменённые. Никакой проблемы по нагрузке это создавать не должно.
Во как!
Спасибо за ответ, щас думаю над тем, чтобы объекты сохранялись при редактировании на лету, токмо асинхронно и в отдельном потоке клиентском (чтоб не тормозил), а в случае глобального запроса ждем завершения всех транзакций. Примерно такая идея у меня была с самого начала - сдесь много плюсов: можно не думать о потере данных при выкл. света, зависании клиента, потере связи с сервером и вообще не думать о кнопочке "сохранить" - это Вы правильно мне подсказываете. Только нужно сделать, чтобы можно было отменить изменения, откатиться до изначальной версии объекта и т.п. undo/redo там всякие.
Я работаю с posgres на фреймворке Qt, не подскажите ли мне: есть ли в постгресе сжатие передаваемых/принимаемых данных, а то что-то не могу найти.
Спасибо.
Вот именно, что вы работает с
Вот именно, что вы работает с SQL, а не с Word/Excel. В SQL нет понятия undo/redo, зато есть понятия транзакции!
Просто для разных задач используются разные технологии!
В тех же банковских/бухгалтерских программах тоже нет никаких undo - если деньги внесены ошибочно, то нужна ещё одна операция, которая приводит в соответствие баланс, но НЕ ОТМЕНЯЕТ предыдущую.
В общем я бы очень и очень рекомендовал бы вам ознакомится с этой переведённой главной мануала, где рассматривается очень показательный пример, который возможно наведёт вас на разные мысли:
http://postgresql.ru.net/manual/tutorial-transactions.html
Про сжатие при передаче данных мне ничего не известно. Но вроде бы как SSL-соединения позволяют сжатие, а PostgreSQL соответственно позволяет работать через SSL-соединения. Но тут точно ничего не скажу