mysql вставляют состояние состязания

Возможно, вы захотите сделать user полем raw_id_fields , поэтому Django не будет пытаться загрузить эти 50000 пользовательских объектов.

class FooAdmin(...):
    # ...
    raw_id_fields = ('user',)

Если вы используете Django 2.0+, вы также можете использовать autocomplete_fields .

11
задан Esteban Küber 15 November 2009 в 21:27
поделиться

5 ответов

то, что Вы хотите, является ТАБЛИЦАМИ БЛОКИРОВКИ

или если это кажется чрезмерным как насчет ВСТАВКИ, ИГНОРИРУЮТ с проверкой, что строка была на самом деле вставлена.

При использовании ПРОИГНОРИРОВАТЬ ключевого слова ошибки, которые происходят при выполнении оператора INSERT, рассматривают как предупреждения вместо этого.

10
ответ дан 3 December 2019 в 06:23
поделиться

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

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

Я думаю первый вопрос, который необходимо задать, то, почему у Вас есть много потоков, делающих ту же самую работу? Почему они должны были бы вставить ту же самую строку?

После этого отвеченного, я думаю, что просто игнорирование ошибок будет самым производительным решением, но иметь размеры, оба подхода (GET_LOCK v/s игнорируют ошибки), и лично убедитесь.

Нет никакого другого способа, о котором я знаю. Почему Вы хотите избежать ошибок? Все еще необходимо кодировать для случая, когда другой тип ошибки происходит.

Поскольку staticsan говорит, что транзакции действительно помогают, но, поскольку они обычно подразумеваются, если две вставки, работал различными потоками, они и будут в подразумеваемые транзакции и видеть последовательные представления базы данных.

4
ответ дан 3 December 2019 в 06:23
поделиться

На техническом уровне транзакция поможет здесь, потому что другие потоки не будут видеть новую строку, пока Вы не будете фиксировать транзакцию.

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

2
ответ дан 3 December 2019 в 06:23
поделиться

Я столкнулся с той же проблемой и поискал в сети moment :)

Наконец, я пришел к решению, аналогичному методу создания объектов файловой системы в общих (временных) каталогах для безопасного открытия временных файлов:

$exists = $success = false;
do{
 $exists = check();// select a row in the table 
 if (!$exists)
  $success = create_record();
  if ($success){
   $exists = true;
  }else if ($success != ERROR_DUP_ROW){
    log_error("failed to create row not 'coz DUP_ROW!");
    break;
  }else{
    //probably other process has already created the record,
    //so try check again if exists
  }
}while(!$exists)

Не бойтесь цикла занятости - обычно выполняется один или два раза.

0
ответ дан 3 December 2019 в 06:23
поделиться

Блокировка всей таблицы действительно излишняя. Чтобы получить желаемый эффект, вам нужно нечто, что в литературе называется «блокировкой предикатов». Никто никогда не видел их, кроме напечатанных на бумаге, на которой публикуются академические исследования. Следующее, что лучше всего, - это блокировки «путей доступа» к данным (в некоторых СУБД: «блокировки страниц»).

Некоторые системы, отличные от SQL, позволяют выполнять и (1), и (2) в одном единственном операторе. , более или менее означающие, что потенциальные условия гонки, возникающие из-за того, что ваша ОС приостанавливает поток выполнения прямо между (1) и (2), полностью исключаются.

Тем не менее, в отсутствие блокировки предикатов такие системы все равно должны будут прибегать какая-то схема блокировки, и чем точнее "степень детализации" (/ "область") блокировок, которые она принимает,

3
ответ дан 3 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: