1

Кто-нибудь пытался реализовать пессимистическую блокировку на GAE? В моем проекте есть некоторые задачи, которые должны быть взаимоисключающими. Я сделал это с помощью:GAE пессимистическая блокировка на CloudSQL

javax.persistence.EntityManager.find(entityClass, primaryKey, LockModeType.PESSIMISTIC_READ); 

который запрашивает БД с помощью SELECT FOR UPDATE и которая работает хорошо ... до тех пор, пока есть только одна заявка экземпляр, который обрабатывает запросы. Если бы было больше случаев, мои запросы обрабатывались бы частично одновременно.

Я испытал это, добавив спать 10 секунд внутри моего взаимоисключающего метода. В одном случае 6 запросов обрабатывались примерно через 60 секунд, но для 3-х экземпляров иногда 20 иногда 30, но не 60 секунд.

Означает ли это, что CloudSQL не реплицирует блокировки среди экземпляров SQL? Есть ли другой способ реализовать пессимистическую блокировку в строке таблицы?

Br Marek

ответ

1

По случаям вы, кажется, имеет в виде CloudSQL экземпляров сервера, а не экземпляры клиентов AppEngine SQL. CloudSQL основан на MySQL, и объем блокировки MySQL действительно ограничен экземпляром одного сервера. Репликация копирует данные SQL, но не сеансы или блокировки. Поэтому ваши измеренные результаты имеют смысл.

Возможно, это не сработает для вас, но вы можете сократить количество экземпляров CloudSQL до 1, но увеличить количество экземпляров сервера AppEngine, которые станут клиентами CloudSQL. Надеюсь, это обеспечит некоторую масштабируемость, не жертвуя согласованностью (пессимистическая блокировка). Ваше затруднительное положение является неизбежным проявлением теоремы CAP.

+0

Большое вам спасибо за ваш быстрый ответ. Я думаю, теперь мне нужно изменить свою реализацию на более оптимистичную, что немного хуже в моем случае, но, вероятно, у меня нет выбора :) –

Смежные вопросы