powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / одневременный update и deadlock
15 сообщений из 15, страница 1 из 1
одневременный update и deadlock
    #37826101
cheese.dp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем добрый день.
Есть следующая схема работы процесса:
Есть большая таблица (несколько миллионов записей), в которую постоянно добавляются новые записи на обработку.
Есть несколько программ-обработчиков поступающих записей. Для выбора новых транзакций используется хранимка в которой следующий подход:
1. на вход хранимки поступает уникальный идентификатор приложения AppID и номер пакета обработки Q (он уникальный в пределах
2. делаем запрос в базу: обнови N необработанных записей (любых) - поставь им номер очереди Q и обработчик app_id
update myRecords
set Sequence=@Q, AppID=@AppID
where Sequence=-1 and AppID=' '
3. выбираем все записи с Q и app_id - они отравляются на обработчик

и вот на этапе 2 у нас часто происходит дедлок
как можно этого избежать?
в пункте 2 нам неважно какие именно необработанные записи выберутся
самое главное условие - чтоб разные обработчики не смогли выбрать одну и ту же запись


P.s. Sybase ASE 15.5
...
Рейтинг: 0 / 0
одневременный update и deadlock
    #37826394
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
условие where Sequence=-1 and AppID=' ' явно не достаточно для логического разделения записей, оттого и дедлок между добавляющими и обновляющим процессом.
Попробуйте в этут таблицу добавить поле со временем добавления записи, а в обновляющем процессе использовать его в условии поиска where Sequence=-1 and AppID=' ' and tran_date between ....
А в обновляющем хранить эти интервалы. Тогда не будет таких явных конфликтов и конкуренции.
...
Рейтинг: 0 / 0
одневременный update и deadlock
    #37826470
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cheese.dp,

Один делает (А,Б) - другой (Б, А).
Избежать просто - пределить однозначный порядок обновлений. (Типа всегда А,Б)
...
Рейтинг: 0 / 0
одневременный update и deadlock
    #37826471
cheese.dp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в принципе поле с датой попадания записи в таблицу есть
при insert оно устанавливается в getdate()
вы предлагаете его использовать?
...
where Sequence=-1 and AppID=' ' and date between dateadd(day,-1, getdate()) and getdate()
так?

и это сможет помочь?
...
Рейтинг: 0 / 0
одневременный update и deadlock
    #37826472
cheese.dp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mikroncheese.dp,
Один делает (А,Б) - другой (Б, А).
Избежать просто - пределить однозначный порядок обновлений. (Типа всегда А,Б)

обработчиков несколько, их не 2 - и их количество может меняться
и вся система должна работать при прекращении работы обработчиков, типа один из десяти упал - ничего, работаем дальше
...
Рейтинг: 0 / 0
одневременный update и deadlock
    #37826477
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понимаю, то после апдейта должен идти комит.
Если так, то можно подумать на счёт "dirty read" для транзакции.
...
Рейтинг: 0 / 0
одневременный update и deadlock
    #37826480
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cheese.dpобработчиков несколько, их не 2 - и их количество может меняться
и вся система должна работать при прекращении работы обработчиков, типа один из десяти упал - ничего, работаем дальше

А я и не про обработчики, а про data rows и порядок их локировки.
...
Рейтинг: 0 / 0
одневременный update и deadlock
    #37826487
cheese.dp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mikronЕсли я правильно понимаю, то после апдейта должен идти комит.
Если так, то можно подумать на счёт "dirty read" для транзакции.
поясните плиз...
...
Рейтинг: 0 / 0
одневременный update и deadlock
    #37826489
cheese.dp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mikronА я и не про обработчики, а про data rows и порядок их локировки.
можно подробнее про этот момент? где почитать?
...
Рейтинг: 0 / 0
одневременный update и deadlock
    #37826506
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чиз, у вас два варианта, либо поняв те идеи, что вам накидали применить их в своей задаче, адаптировав под конкретные ваши условия, либо показывать схему таблицы, что и как обрабатывается, т.е. дать решать задачу нам, вместо вас.
Лучше конечно же самому..
...
Рейтинг: 0 / 0
одневременный update и deadlock
    #37826792
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cheese.dpmikronЕсли я правильно понимаю, то после апдейта должен идти комит.
Если так, то можно подумать на счёт "dirty read" для транзакции.
поясните плиз...
Я бы попробывал так:
1. поставить уровень изоляции read uncommitted
2. Выполнить обновление как было описано и закрепить транзакцию.
3. Вернуть уровень изоляции
4. Совершить чтение как было писано вами ранее.

Походу возник интересный вопрос: что произойдёт если транзакция выполнит коммит раньше чем поставьщик данных (тот, кто делает инсерт) и что будет с поставщиком при коммите/роллбэке?
...
Рейтинг: 0 / 0
одневременный update и deadlock
    #37826802
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikroncheese.dpпропущено...

поясните плиз...
Я бы попробывал так:
1. поставить уровень изоляции read uncommitted
2. Выполнить обновление как было описано и закрепить транзакцию.
3. Вернуть уровень изоляции
4. Совершить чтение как было писано вами ранее.

Походу возник интересный вопрос: что произойдёт если транзакция выполнит коммит раньше чем поставьщик данных (тот, кто делает инсерт) и что будет с поставщиком при коммите/роллбэке?

Я не прав. Глупая идея. Не пробуйте так, так ничего не будет.
...
Рейтинг: 0 / 0
одневременный update и deadlock
    #37827022
cheese.dp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ggg_oldчиз, у вас два варианта, либо поняв те идеи, что вам накидали применить их в своей задаче, адаптировав под конкретные ваши условия, либо показывать схему таблицы, что и как обрабатывается, т.е. дать решать задачу нам, вместо вас.
Лучше конечно же самому..

да тут-то и показывать особо нечего
основной момент - то, что в таблицу попадают данные от внешних систем с большой частотой (эту часть никак нельзя менять)
мне лишь нужно максимально быстро выбрать записи, и обработать их
...
Рейтинг: 0 / 0
одневременный update и deadlock
    #37827100
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну тогда привязывайтесь ко времени в обработчике, как я предложил.
Только тут важно, что-бы процесс, который назначает номер Q задания для обработчиков был один. Иначе будет та же конкуренция и дедлоки.
Итого выходит так:
- много писателей, которые пишут события. В событии присутствует время поступения. Вот последнее время поступления еще постоянно отражается в вспомогательной табличке.
- Один процесс, который назначает номера на обработку читает из вспомогательных таблиц время своего предыдущего запуска и время последнего добавленного события. Вспомогательные таблицы нужны, что-бы не делать select max() from таблица_событий.
Если сервер азе или SA в режиме блокировчника, то таблицу с временем последней добавленной транзакции можно читать в режиме dirty read, т.к. добавляющие процессы будут конкурировать за эту таблицу.
- Все записи с интервалом временем между предыдущим стартом и считанным текущим временем апдейтим как вам надо.
- фиксируем новый интервал времени как время предыдущего запуска скрипта.

Нужны соответственно индексы по полю времени.
...
Рейтинг: 0 / 0
одневременный update и deadlock
    #37833611
blzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / одневременный update и deadlock
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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