powered by simpleCommunicator - 2.0.19     © 2024 Programmizd 02
Map
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / дедлоки...
25 сообщений из 29, страница 1 из 2
дедлоки...
    #39609882
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица, туда загружается большой файл. То есть примерно 40 потоков параллельно делают следущее:

BEGIN TRAN
SELECT * FROM T WHERE FIELD=?
если есть запись
UPDATE T SET ... WHERE FIELD=?
иначе
INSERT INTO T...
COMMIT

Часть записей отваливается с ошибкой что то вроде deadlock detected victim...
Я подозреваю происходит это из-за:
поток 1 выполнил селект на запись SHAREDLOCK, второй(ые) выполняют селект и ставят опят SHAREDLOCK на ту же запись, никто из них не может выполнить UPDATE из-за наставленных SHAREDLOCK ов.

SELECT WITH(UPDLOCK) не помогает.
Как здесь организовать что то наподобие ораклового SELECT FOR UPDATE ? Что бы ставил сразу WRITELOCK при селекте до конца транзакции? Или может есть лучше варианты?
...
Рейтинг: 0 / 0
дедлоки...
    #39609884
no56892,

Надо профайлером поймать граф дедлока.
Перед этим можно посмотреть на фактический план выполнения подобных запросов.

Большой файл надо балком запульнуть в staging-таблицу и всякой построчной фигней заниматься на staging-таблице.
...
Рейтинг: 0 / 0
дедлоки...
    #39609885
Hello world!11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
на поле FIELD есть индекс?

грузите болшой файл построчно?
...
Рейтинг: 0 / 0
дедлоки...
    #39609886
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторБольшой файл надо балком запульнуть в staging-таблицу и всякой построчной фигней заниматься на staging-таблице.
Не вариант

авторгрузите болшой файл построчно?
Да, там условно в нем присутствуют элементы, которые по одному читаются и раскидываются по 40 потокам, чья задача собственно и запихнуть в базу по одному.

авторна поле FIELD есть индекс?
Делал, не помогло. Может не того типа? Nonclustered, поле VARCHAR
...
Рейтинг: 0 / 0
дедлоки...
    #39609900
Фотография sparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
надо повышать уровень изоляции
...
Рейтинг: 0 / 0
дедлоки...
    #39609901
Фотография sparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
заранее
...
Рейтинг: 0 / 0
дедлоки...
    #39609902
Фотография sparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или новые индексы создавать.
...
Рейтинг: 0 / 0
дедлоки...
    #39609903
Фотография sparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какой тип там у FILEID? int?
...
Рейтинг: 0 / 0
дедлоки...
    #39609912
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Varchar(30). Опытным путем установлено, что select with (update) ставит U блокировку на ROW, а также IU на PAGE. Я так понял IU этонорм и от нее не избавиться? Тоесть все ок вроде бы, пока не закоммитится селект, вторая транзакция висит на селекте ждет, что ок. Правда тестировал на другом скл сервере, мб настройки разные у них, но это вряд ли...
...
Рейтинг: 0 / 0
дедлоки...
    #39609918
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Бестолку обсуждать дедлок без его графа.
2. no56892BEGIN TRAN
SELECT * FROM T WHERE FIELD=?
если есть запись
UPDATE T SET ... WHERE FIELD=?
иначе
INSERT INTO T...
COMMITЭту красоту заменить на один MERGE. Или, по крайней мере, убрать SELECT.
...
Рейтинг: 0 / 0
дедлоки...
    #39609928
SHAREDLOCK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
no56892,

авторпока не закоммитится селект
Это не быстро. Надо подождать пока это придумают.
...
Рейтинг: 0 / 0
дедлоки...
    #39609937
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no5689240 потоков параллельно делают следущее:

SELECT * FROM T WHERE FIELD=?на вскидку...

- раскидывайте по потокам данные с разными FIELD чтобы вероятность их пересечения минимизировалась

- делать в три шага (если допустимо с точки зрения транзакционности):
1. получить из файла уникальные FIELD
2. прочитать таблицу пометив какие FIELD есть каких нет (читать из таблицы PK если есть и складывать в
памяти в структуру маппинга FIELD - PK)
3. делать update
4. делать инсерт

- таблицу секционировать чтобы отдельный поток лился в свою секцию (секции потом объединять если нужно)

это так, вообще а, конкретика только после графа дедлока
...
Рейтинг: 0 / 0
дедлоки...
    #39609946
Фотография sparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Varchar(30) классный тип,
Вы нормализацию пробовали делать?
...
Рейтинг: 0 / 0
дедлоки...
    #39609952
Фотография sparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
там Чё гуид?
...
Рейтинг: 0 / 0
дедлоки...
    #39609958
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892авторБольшой файл надо балком запульнуть в staging-таблицу и всякой построчной фигней заниматься на staging-таблице.
Не вариант


Ну... продолжайте маяться фигней... в сорок потоков.

no56892Как здесь организовать что то наподобие ораклового SELECT FOR UPDATE ? Что бы ставил сразу WRITELOCK при селекте до конца транзакции? Или может есть лучше варианты?
Код: sql
1.
with(holdlock)



no56892Или может есть лучше варианты?

Как вам уже докладывали, лучше - BULK INSERT. Хоть в сорок потоков.
А потом... merge в один.
...
Рейтинг: 0 / 0
дедлоки...
    #39609964
Фотография sparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222,
нету, ключ длинный
...
Рейтинг: 0 / 0
дедлоки...
    #39610248
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
main.BMSG:
BMSGID NUMMERIC(18,0) NOT NULL
BMSG_NUMBER VARCHAR(30) NOT NULL
BMSG_PAYLOAD VARCHAR(255) NULL

NONCLUSTEREDINDEX (NON UNIQUE, NONCLUSTERD) ON BMSG)NUMBER
...
Рейтинг: 0 / 0
дедлоки...
    #39610305
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmЭту красоту заменить на один MERGE. Или, по крайней мере, убрать SELECT.
40 потоков MERGE? OMG...

Как насчет секционирования или даже разбиения исходной таблицы на несколько?
...
Рейтинг: 0 / 0
дедлоки...
    #39610313
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опытным путем установлена доп инфа:
Select for update with (updlock) where x=y а затем update where x=y работают как и ржидалось. Тоесть пока не закоммитится транзакция с select with updlock, останые select with updlock висят в ожидании, все супер, тоесть такую ситуацию создает insert как то косвенно, вот бы понять как...вариант без селекта, тоесть фигачим апдейт если 0 rows аffected то insert если unique constraint то снова update не желательно, тк тут soa и все дела, айдишники выдает сторонний сервис, перерасход нежелателен...никак не могу понять, как инсерт создает дедлок здесь, так же есть вариант, если deadlock, то еще раз повторить, но это все полумеры какие то
...
Рейтинг: 0 / 0
дедлоки...
    #39610389
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тредстартеру 40 потоков важнее эффективности.

Можно расходиться.
...
Рейтинг: 0 / 0
дедлоки...
    #39610432
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выше я выкладывал дедлок граф, по нему вообще ничего не понятно? А что скл сервер не умеет работать параллельно с десятком сессий над одной таблицей? Хмм, выше все предложенное как уже писал на мой взгляд полумеры, хотя инсерты + мердж даже будут побыстрее, но тут есть некоторые ограничения (исторические) на вызов самого метода кот все это делает(читает и заливает файл)
...
Рейтинг: 0 / 0
дедлоки...
    #39610449
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дарю для размышлений кейс решения подобной задачи.

Кролик слал сообщения в таблицу БД через вызов ХП (внутри 1 insert), максимальная скорость составляла 60 штук в секунду. На определенном этапе эта скорость оказалась недостаточной. Проблему стали решать двумя способами. Первый сводился к многопоточной записи, дал скорость около 150 в секунду и был принят во всей организации, кроме моей делянки.

Второй способ, разработанный мной, позволил SSIS лезть напрямую в шину и выкачивать сообщения пачкой, после чего разбираться с ними в целом. Средняя скорость обработки (с учетом пауз) доходила до 1000 в секунду и выше.

Описание сильно в общих чертах, потому опускаю ожидание, подтверждение, логирование и прочие удовольствия. Побочный эффект - коллеги обратились с жалобой, что очередь никто не слушает. А, нет, есть слушатель... Ой, снова нет! Правильно, после получения пачки SSIS отсоединялся (хотя можно было этого и не делать). После перенастройки Заббикса коллеги перестали тревожиться.
...
Рейтинг: 0 / 0
дедлоки...
    #39610455
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Выше я выкладывал дедлок граф, по нему вообще ничего не понятно?у вас несколько процессов взаимоблокируют друг друга на операциях SELECT и UPDATE пытаясь наложить U блокировку на ключ индекса.
типа так:
process1 SELECT ждёт "А"
process2 UPDATE заблокировал "Б" ждёт "А"
process3 SELECT ждёт "Б"
process4 UPDATE ждёт "Б" заблокировал "А"
...
Рейтинг: 0 / 0
дедлоки...
    #39610458
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
покажите планы ваших запросов, как у вас используется индекс.
...
Рейтинг: 0 / 0
дедлоки...
    #39610465
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как может заблокировать апдэйт Б держа лок на А? Селект и апдейт идут по одному и тому же значению, те если выполняется апдейт на Б то он уже захватил U при предыдущем селекте.план запросо постараюсь сделать
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / дедлоки...
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]