2009-04-23 5 views
4

Существуют ли хорошо известные рекомендации по синхронизации задач на ферме серверов? Например, если у меня есть сайт на базе форума, работающий на ферме серверов, и есть два модератора, которые пытаются выполнить некоторые действия, требующие записи в несколько таблиц в базе данных, а запросы этих модераторов обрабатываются разными серверами на сервере фермы, как можно реализовать некоторые функции блокировки, чтобы гарантировать, что они не могут принять это действие в одном и том же элементе одновременно?Как реализовать блокировку в ферме серверов?

До сих пор я думал об использовании таблицы в базе данных для синхронизации, например. проверьте идентификатор элемента в таблице, если он не exsit вставить его и продолжить, в противном случае вернуться. Возможно, для этого можно использовать общий кэш, но я не использую его в данный момент.

Любой другой способ?

Кстати, я использую MySQL в качестве базы данных моей базы данных.

+0

Существует несколько запросов на запросы, пытающихся получить доступ к серверу базы данных одновременно. То, что они находятся на другом сервере, на самом деле сильно не меняется. – jfclavette

+0

ОК, но они влияют на несколько записей одновременно, я не хочу, чтобы другой запрос влиял на одни и те же записи, пока первый запрос все еще находится в действии.Простыми словами, я хочу иметь что-то вроде ключевого слова lock на C#, но хочу, чтобы он работал распределенным способом. –

ответ

1

Если все состояние находится в (центральной) базе данных, транзакции базы данных должны позаботиться об этом для вас.

См http://en.wikipedia.org/wiki/Transaction_(database)

+0

Насколько я понимаю, транзакции используются, чтобы гарантировать, что все операторы транзакции будут выполнены или ни один из них не будет выполнен. Как это связано с безопасностью блокировки или потоком? Блокирует ли транзакция все затронутые таблицы (таблицы, участвующие в транзакции) или блокирует/блокирует другие транзакции, пока не закончит? –

2

Вы можете исследовать распределенные запирающие услуги, такие как Zookeeper. Это повторная реализация службы Google, которая обеспечивает координацию блокировки распределенных ресурсов с высокой скоростью для приложений. Я не знаю, как легко было бы включить в веб-приложение.

0

Наличие стола замков - это способ, которым это нужно, просто и работает.

Вы также можете иметь код как услугу на одном сервере, более подход к SOA.

Вы также можете использовать поле TimeStamp с Transactions, если временная метка изменилась с момента последнего получения данных, вы можете вернуть транзакцию. Поэтому, если кто-то попадает в первую очередь, у них есть приоритет.

4

Ваш вопрос подразумевает управление параллелизмом уровня данных - в этом случае используйте механизмы управления параллелизмом РСУБД.

Это не поможет вам, если позже вы захотите управлять действиями уровня приложения, которые не обязательно сопоставляют друг с другом объект данных (например, доступ к записи в таблице). Общее решение - это обратный прокси-сервер, который понимает семантику уровня приложения и, при необходимости, сериализует. (Это отрицательно повлияет на доступность.)

Возможно, было бы неловко читать теорему CAP!

0

Это может быть неуместно для вас, потому что вопрос старый, но он по-прежнему может быть полезен для других, поэтому я буду публиковать его в любом случае.

Вы можете использовать запрос «SELECT FOR UPDATE» для объекта блокировки, поэтому вы фактически используете db для достижения механизма блокировки.

если вы используете ORM, вы также можете это сделать. например, в nhibernate вы можете:

session.Lock(Member, LockMode.Upgrade);