Доступ к базе данных с несколькими экземплярами

#mysql #database #entity-framework #asp.net-core #mariadb

Вопрос:

Описание

У меня есть несколько примеров ASP.Net Основное приложение, которое использует одну базу данных MariaDB.

Несколько экземпляров являются копиями одного и того же ASP.Net Основное приложение для реализации горизонтальной шкалы производительности.

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

Мы можем добавить эти ограничения в саму базу данных, в сохраненный процесс или в приложение с ядром EF.

Пример

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

Вопросы

  1. Является ли это распространенным способом проверки этих ограничений в приложении с помощью ef core?
  2. Можем ли мы получить проблемы, такие как несоответствие или прерывание записей при таком подходе?

Комментарии:

1. База данных SQL обычно официально поддерживает ограничения, такие как внешний ключ. Вот так: w3schools.com/sql/sql_check.asp Обычно вам не нужно проверять данные с помощью C#. Я думаю, что для вас лучше всего использовать транзакцию на уровне чистой базы данных, а не проверять ее с помощью кода C#.

2. @Anduin спасибо за ваш ответ. Инструкция check очень полезна, но в моем случае мне нужно проверить уникальное ограничение для нескольких столбцов. Я обновил вопрос.

Ответ №1:

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

Если, с другой стороны, это приводит к дополнительной сложности, то этот совет может оказаться контрпродуктивным.

Если достаточно иметь два UNIQUE индекса в таблице, сделайте это. Это сводит все к одному SQL, а не к предложенным вами идеям с несколькими операторами.

Проверка «ключа dup» после попытки INSERT не является обходом сервера туда и обратно, поэтому она дешевая.

Это почти звучит так, как будто INSERT IGNORE этого было бы достаточно.

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

Пожалуйста, предоставьте ПОКАЗАТЬ ТАБЛИЦУ СОЗДАНИЯ для таблицы(таблиц) и инструкцию(инструкции) записи. Кроме того, используется ли жесткий диск или SSD-накопитель? Существует множество оптимизаций, которые могут позволить ему работать намного быстрее, чем 100 в секунду. Но мы не можем дать вам полезный ответ, не обсудив детали. Неясно, означает ли «несколько экземпляров», что несколько потоков попадают в одну таблицу, несколько потоков попадают в несколько таблиц или даже несколько экземпляров MariaDB (в виртуальных машинах или докерах) на одном сервере.

Некоторые вещи для ускорения: ЙОДКУ, пакетные вставки, искусственное добавление BEGIN COMMIT и т.д.