Как улучшить INSERT INTO & hellip; ВЫБЕРИТЕ режим блокировки

У меня была эта проблема, и я делал то, что было задокументировано, и она все еще не работает.

Посмотрите на свое сообщение об ошибке и убедитесь, что у вас нет специальных символов, которые были скопированы. Я получал ошибку

SyntaxError: illegal character @(shell):1:43

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

Я занимался разработкой в ​​WebMatrix и копировал идентификатор объекта, и я возвращал его обратно, и он удалил открытую цитату, затем я вернул цитату и выполнил запрос, и это сработало. с консоли. Всякий раз, когда вы копируете с консоли в WebMatrix, вы, вероятно, заберете некоторые невидимые символы, которые вызовут ошибки.

38
задан nhahtdh 24 October 2014 в 04:43
поделиться

5 ответов

Возможно, вы могли бы использовать команду «Создать представление» (см. Синтаксис создания представления ). Например,

Create View temp as SELECT FROM HighlyContentiousTableInInnoDb WHERE allKindsOfComplexConditions are true

После этого вы можете использовать оператор вставки с этим представлением. Примерно так

INSERT INTO TemporaryTable (SELECT * FROM temp)

Это только мое предложение.

1
ответ дан 27 November 2019 в 02:52
поделиться

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

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

Но следующее - это некий мозговой штурм: если пространство не проблема, вы можете подумать о запуске двух экземпляров одной и той же таблицы. HighlyContentiousTableInInnoDb2 для вашей постоянно читаемой / записывающей транзакции и HighlyContentiousTableInInnoDb2_shadow для вашего пакетного доступа. Возможно, вы сможете автоматически заполнить теневую таблицу с помощью триггеров / подпрограмм внутри вашей СУБД, что быстрее и умнее, чем повсюду дополнительная транзакция записи.

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

0
ответ дан 27 November 2019 в 02:52
поделиться

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

Как насчет настройки вторичной эквивалентной таблицы HighlyContentiousTableInInnoDb2 и создания триггеров AFTER INSERT и т. Д. В первой таблице, которые обновляют новую таблицу с теми же данными. Теперь у вас должна быть возможность заблокировать HighlyContentiousTableInInnoDb2 и замедлить только триггеры основной таблицы, а не все запросы.

Возможные проблемы:

  • 2 сохраненных данных
  • Дополнительная работа для всех вставок, обновлений и удалений
  • Может быть нецелесообразно с точки зрения транзакций
1
ответ дан 27 November 2019 в 02:52
поделиться

Если вы можете допустить некоторые аномалии, вы можете изменить УРОВЕНЬ ИЗОЛЯЦИИ на наименее строгий - ПРОЧИТАЙТЕ НЕОБХОДИМО. Но в это время кому-то разрешено читать из целевой таблицы ur. Или вы можете заблокировать целевую таблицу вручную (я предполагаю, что mysql предоставляет эту функцию?).

Или, в качестве альтернативы, вы можете использовать READ COMMITTED, который также не должен блокировать исходную таблицу. Но он также блокирует вставленные строки в целевой таблице до фиксации.

Я бы выбрал второй.

1
ответ дан 27 November 2019 в 02:52
поделиться

Я не знаком с MySQL, но, надеюсь, есть эквивалент уровням изоляции транзакции Снимок и Чтение зафиксированного снимка в SQL Server. Использование любого из них должно решить вашу проблему.

0
ответ дан 27 November 2019 в 02:52
поделиться
Другие вопросы по тегам:

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