Как избежать блокировки базы данных при одновременном хранении и получении данных?
Мы разработали приложение для Windows, которое используется как обычное приложение; собирая огромную информацию, обрабатывая ее и создавая отчеты... И для хранения данных мы использовали SQL Server. Для отчетов мы использовали Crystal Reports.
В нашем офисе более 150 сотрудников, использующих приложение. Большинство из них являются операторами ввода данных. Таким образом, хотя хранение данных предполагает, что кто-то пытается сгенерировать отчет, приложение перестало работать, и произошла тупиковая ситуация. Существуют разные потоки, созданные для хранения информации, и разные потоки для получения одного и того же (или создания отчетов).
Таким образом, вопрос состоит в том, как избежать ситуации тупиковой блокировки, потому что Хранение данных и генерация отчетов - это непрерывная процедура, которая не может сначала запросить сохранение данных, затем обработать их и затем сгенерировать отчеты...
Как сделать обе вещи одновременно, т.е. хранить и извлекать данные? Есть ли способ избежать тупика?
Любые предложения или вопросы, связанные с этим, приветствуются.
ОБНОВИТЬ
В этом случае полезно ли использование представлений?
Благодарю вас!!
4 ответа
По умолчанию при подключениях ODBC Crystal Reports использует самый высокий уровень изоляции базы данных, поддерживаемый драйвером, а именно Read Committed. Вы можете добавить раздел реестра, чтобы указать Crystal использовать более низкий уровень изоляции.
Вот документ, содержащий полные инструкции: 1216415 - Как изменить уровень изоляции для соединения ODBC в Crystal Reports?
- Мне бы пришлось использовать разные базы данных: одну для получения и обработки данных, а другую для хранения отчетных данных.
-Бизнес-правила, которые разрешают грязное чтение, а затем создают моментальный снимок, где данные синхронизируются из вставленных данных в базу данных отчетов.
- Бизнес-правило: нет грязных чтений, затем синхронизируйте данные, вставленные и сразу вставив их в базу данных отчетов.
- Заполняемая таблица не должна быть той, которая используется для составления отчетов.
- Вы можете совершать транзакции, но это сделает отчет более длительным в период ожидания.
Вы можете попробовать это, чтобы избежать тупика базы данных.
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/