Разработайте блокировку для SQL Server, чтобы облегчить конфликт между INSERT и SELECT - PullRequest
1 голос
/ 30 марта 2012

SQL Server - это SQL Azure, в основном это SQL Server 2008 для обычного процесса.

У меня есть таблица с именем TASK, в которой постоянно появляются новые данные (новая задача) и удаляются (задача выполнена)

Для ввода новых данных я использую INSERT INTO .. SELECT ..., большую часть времени занимает очень много времени, скажем, дюжина минут.

Для старых данных я сначала использую SELECT (WITH NOLOCK), чтобы получить задание, UPDATE, чтобы сообщить другому потоку, что эта задача уже начинает обрабатываться, затем DELETE после завершения.

Мертвая блокировка иногда происходит на SELECT, большая часть - на UPDATE и DELETE.

это не критичная по времени задача, поэтому я могу начать обрабатывать новые данные, как только завершится INSERT.Есть ли какой-либо тип LOCK, чтобы попросить SELECT не выбирать его до завершения INSERT?Или любое другое предложение, чтобы избежать конфликта.Я могу изменить дизайн таблицы, если это необходимо.

Ответы [ 2 ]

1 голос
/ 01 апреля 2012

позже sqlserver2005, разрешить блокировку легко. для конфликта 1.Вы можете воспользоваться услугой брокера. 2. использовать уровень изоляции.

dbcc useroptions, в последней строке вы можете видеть, что уровень разрешения дефолта - read_committed, это уровень сеанса. мы можем изменить уровень на read_committed_snapshot для конфликта, в sqlserver, а не на самом деле блокировка строки, как oracle.but мы можем использовать этот метод реализовать.

ALTER DATABASE DBName SET READ_COMMITTED_SNAPSHOT ON;

открыть эту функцию, должен в однопользовательском шаме.

и вы можете проверить это. для сеанса A, сеанса B.

A: обновить table1 set name = 'new' с помощью (Xlock) где id = 1 B: вы все еще обновляете другую строку и выбираете все данные из таблицы.

мой английский не очень хорош, но для блокировки, я знаю.

в sqlserver, для функции есть три блокировки. 1. Оптимистическая блокировка, используйте метку времени (rowversion). Блокировка 2.pessimism, принудительная блокировка при использовании date.use Ulock, Xlock и так далее. 3. виртуальная блокировка, используйте процедуру getapplock ().

если вам нужна блокировка schame в архитектуре системы, пожалуйста, напишите мне: mjjjj2001@163.com

1 голос
/ 31 марта 2012

Рассмотрите возможность использования сервисного брокера, если это очередь на обработку.

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

Сеанс вставки и все транзакции были зафиксированы и закрыты при запуске сеанса удаления?Есть ли несколько сеансов удаления, запущенных одновременно?Очень важно иметь индекс для столбцов, которые вы используете для идентификации задачи для операторов SELECT / UPDATE / DELETE, особенно если вы переходите на более высокий уровень изоляции, например REPEATABLE READ или SERIALIZED.

Все эти проблемы можно решить, перейдя в Service Broker, если это необходимо.

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