#mysql #database #entity-framework #asp.net-core #mariadb
Вопрос:
Описание
У меня есть несколько примеров ASP.Net Основное приложение, которое использует одну базу данных MariaDB.
Несколько экземпляров являются копиями одного и того же ASP.Net Основное приложение для реализации горизонтальной шкалы производительности.
Приложение выполняет несколько операций записи (100 операций записи в секунду) в базу данных, где необходимо проверить уникальные ограничения по двум столбцам в одной таблице.
Мы можем добавить эти ограничения в саму базу данных, в сохраненный процесс или в приложение с ядром EF.
Пример
Для exmaple мы запускаем транзакцию, запрашиваем некоторые данные, чтобы проверить ограничение, записываем данные и фиксируем транзакцию. Мы делаем это в общей сложности 100 раз в секунду из разных экземпляров приложения.
Вопросы
- Является ли это распространенным способом проверки этих ограничений в приложении с помощью ef core?
- Можем ли мы получить проблемы, такие как несоответствие или прерывание записей при таком подходе?
Комментарии:
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 и т.д.