Должен ли я использовать cflock или нет? - PullRequest
4 голосов
/ 25 октября 2010

Я хотел бы знать, необходима ли блокировка моей таблицы в этой ситуации (я использую Coldfusion и MySQL):

У меня есть таблица с именем wishlists(memberId, gameId, rank, updateAt), где участники хранят игры в личном списке.

wishlists имеет «человек ко многим» с таблицей members и «многие ко многим» с таблицей games.Многие участники имеют много игр, хранящихся в этом списке.Эти игры ранжируются с использованием поля int.Ранги являются специфическими для участника, поэтому:

Member 1 can have itemId=1, rank=1; itemId=2, rank=2
Member 2 can have itemId=1, rank=1, itemId=2, rank=2
etc...

Каждый участник может изменить свой список, удалив элемент или изменив ранг элемента ( sendGameToTopOfList (), deleteItemFromList () , например).Это означает, что каждый раз, когда вносятся изменения в список, список должен быть ранжирован снова.Я написал отдельную функцию под названием rankList () для обработки повторного ранжирования.Он запускается после « deleteGameFromList () » или « sendGameToTopOfList () ; он делает следующее:

1. Gets a memberWishlist query of all records @memberId ordered first by **rank ASC**, then **updateAt ASC** fields 
2. Loops through memberWishlist query and sets each row's **rank=memberWishlist.RecordCount**

updateAt поле необходимо, потому что если игра былаПереместившись в начало списка, мы получили бы два элемента с номером 1, и для их дифференциации я использую updatedAt. * ​​1023 *

Сценарий один : у участника в списке 100 игр:

  1. Участник перемещает элемент наверх; rankList () вызывается после завершения операции.
  2. Пока rankList () продолжает перераспределять элементы, участник удаляет игру

В обычном запросе страницы это нормально, так как страница не будет перезагружаться, пока не будет выполнена rankList (). Но если бы это был ajax, или если вы использовали cfthread, участник может удалить 10 игр за 5 секунд, нажавдействительно очень быстро. С другой стороны, список будет все равно ранжироваться после удаления, так что это может не иметь значения, но мне кажется, что это то, что я должен защищать ...

Сценарий 2: Некоторые из этих пунктов списка желаний могут бытьДля выполнения заказов используйте дополнительное поле queuedForShipping. Если queuedForShipping равен 1, функция rankList () их игнорирует.Что, если администратор создавал отправку, когда участник только что удалил элемент или переместил его в верхнюю часть?

Ваши мысли приветствуются.

Дополнительная информация: Новые элементы автоматически ранжируются последними при вставке

1 Ответ

2 голосов
/ 25 октября 2010

Нет.CFLock не будет иметь какого-либо влияния на то, как MySQL обрабатывает вещи.

Однако вам может потребоваться транзакция.Обертывание ваших нескольких операций в блок транзакции скажет MySQL, что вы хотите гарантировать, что все операции завершены до окончательного сохранения изменений.

Это предполагает, что ваши множественные запросы генерируются в CF, например:

<cffunction sendToTopOfList()>
    <cfquery>
       send to top
    </cfquery>
    <cfquery>
        resort everything
    <cfquery>
</cffunction>

Если вы используете хранимую процедуру на сервере БД, то (1) я, вероятно, не будуслишком обеспокоен условиями гонки здесь, так как вы, вероятно, будете применять блокировки строк, когда сервер вносит изменения, и (2) изучать использование транзакций на сервере БД, если вы все еще обеспокоены.

Если у вас все еще есть вопросы,Я постараюсь ответить на них, хотя я на самом деле не эксперт по MySQL и не пользовался им в последние несколько лет.

...