Я хотел бы знать, необходима ли блокировка моей таблицы в этой ситуации (я использую 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 игр:
- Участник перемещает элемент наверх; rankList () вызывается после завершения операции.
- Пока rankList () продолжает перераспределять элементы, участник удаляет игру
В обычном запросе страницы это нормально, так как страница не будет перезагружаться, пока не будет выполнена rankList (). Но если бы это был ajax, или если вы использовали cfthread, участник может удалить 10 игр за 5 секунд, нажавдействительно очень быстро. С другой стороны, список будет все равно ранжироваться после удаления, так что это может не иметь значения, но мне кажется, что это то, что я должен защищать ...
Сценарий 2: Некоторые из этих пунктов списка желаний могут бытьДля выполнения заказов используйте дополнительное поле queuedForShipping. Если queuedForShipping равен 1, функция rankList () их игнорирует.Что, если администратор создавал отправку, когда участник только что удалил элемент или переместил его в верхнюю часть?
Ваши мысли приветствуются.
Дополнительная информация: Новые элементы автоматически ранжируются последними при вставке