У меня есть приложение, которое использует LMDB. Если несколько процессов необходимо записать в базу данных, только один из них будет разрешен для запуска одновременно и остального блока. Из-за этого я хочу переписать приложение для использования модели клиент-сервер.LMDB: Перемещение транзакций без отката всего
Если приложение написано для использования модели клиент-сервер, сервер может управлять записью, а другие процессы не будут блокироваться. Однако, если клиент сталкивается с ошибкой и должен отменить свою транзакцию, как он может откатить свои данные, не откатываясь от того, что другие клиенты написали?
Я просмотрел вложенные транзакции, но транзакции записи могут иметь только одну вложенную транзакцию. Поэтому, когда клиент может записывать свои данные во вложенную транзакцию и откатывать ее обратно, если возникает ошибка, только один клиент сможет работать одновременно. Таким образом, хотя это решает проблему отката, мы возвращаемся к проблеме, которую может написать только один клиент за раз.
Я также рассмотрел опцию MDB_NOLOCK, которая заставляет LMDB не мешать вам создавать несколько транзакций записи. При попытке совершить любую транзакцию, кроме первой, она вернет ошибку. Возможно, клиенты могут объединить свои записи в свои транзакции, и когда они будут готовы к фиксации, сервер будет выгружать записи в первую транзакцию записи, но это хакки, и я уверен, что это НЕ то, что разработчики намеревались сделать для использования.
Единственное другое решение, о котором я могу думать, заключается в том, чтобы держать клиентов в отдельной базе данных, что отменяет целую цель перехода на модель клиент-сервер.
Есть ли другие способы, позволяющие различным процессам писать в базу данных, имея возможность откатывать данные одного клиента, не откатывая все?