Как избежать блокировки базы данных при одновременном хранении и получении данных?

Мы разработали приложение для Windows, которое используется как обычное приложение; собирая огромную информацию, обрабатывая ее и создавая отчеты... И для хранения данных мы использовали SQL Server. Для отчетов мы использовали Crystal Reports.

В нашем офисе более 150 сотрудников, использующих приложение. Большинство из них являются операторами ввода данных. Таким образом, хотя хранение данных предполагает, что кто-то пытается сгенерировать отчет, приложение перестало работать, и произошла тупиковая ситуация. Существуют разные потоки, созданные для хранения информации, и разные потоки для получения одного и того же (или создания отчетов).

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

Как сделать обе вещи одновременно, т.е. хранить и извлекать данные? Есть ли способ избежать тупика?

Любые предложения или вопросы, связанные с этим, приветствуются.

ОБНОВИТЬ

В этом случае полезно ли использование представлений?

Благодарю вас!!

4 ответа

Решение

По умолчанию при подключениях ODBC Crystal Reports использует самый высокий уровень изоляции базы данных, поддерживаемый драйвером, а именно Read Committed. Вы можете добавить раздел реестра, чтобы указать Crystal использовать более низкий уровень изоляции.

Вот документ, содержащий полные инструкции: 1216415 - Как изменить уровень изоляции для соединения ODBC в Crystal Reports?

  1. Мне бы пришлось использовать разные базы данных: одну для получения и обработки данных, а другую для хранения отчетных данных. -Бизнес-правила, которые разрешают грязное чтение, а затем создают моментальный снимок, где данные синхронизируются из вставленных данных в базу данных отчетов.
    • Бизнес-правило: нет грязных чтений, затем синхронизируйте данные, вставленные и сразу вставив их в базу данных отчетов.
  2. Заполняемая таблица не должна быть той, которая используется для составления отчетов.
  3. Вы можете совершать транзакции, но это сделает отчет более длительным в период ожидания.

Вы можете попробовать это, чтобы избежать тупика базы данных.

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    BEGIN TRANSACTION;

Я бы включил Read Committed Snapshot Isolation в вашем сервере sql, так что писатели не блокируют читателей. Но читатели не могут читать записи, написанные до их фиксации.
Другими словами, не блокируйте читателей, но и не делайте грязного чтения

вот отличная статья об этом
https://www.brentozar.com/archive/2013/01/implementing-snapshot-or-read-committed-snapshot-isolation-in-sql-server-a-guide/

Другие вопросы по тегам