powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / пессимистическая блокировка
16 сообщений из 16, страница 1 из 1
пессимистическая блокировка
    #39981722
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно прочитать некоторое количество записей из таблицы, и заблокировать их для других транзакций. В MSSQL для этого применяется такой код
Код: sql
1.
select top 10 from table with (updlock, rowlock, nowait, readpast) where bla bla bla


приведенный набор хинтов не только блокирует записи, но и делает их невыдимыми для точно таких же запросов, вызываемых из других транзакций - они получают непересекающиееся наборы данных.
Попробовал аналог в ASE 15.7 - ничего не получается. В том числе и для каждого хинта по отдельности.
Код: sql
1.
select top 10 from table with (updlock, holdlock, readpast) where bla bla bla


Код: plaintext
Incorrect sintax near keyword 'with'

Что это? Неправильный запрос или драйвер не справился? Используется jtds-1.3.1
...
Рейтинг: 0 / 0
пессимистическая блокировка
    #39981863
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra,

В ASE такой возможности нет.

И вообще, зачем такое может понадобиться?
...
Рейтинг: 0 / 0
пессимистическая блокировка
    #39981904
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,

сценарий такой: есть буферная таблица, в которую попадают данные, и эти данные надо дальше передать, в другие системы. Для этого некий робот периодически делает запрос к данной таблице, примерно такой, как наверху. Робот работает в XA транзакции, в результате обеспечивается атомарное взаимодействие с другими системами. В простейшем случае никаких хинтов не надо, но всё осложняется тем, что для устойчивости и масштабируемости одновременно работает несколько таких роботов.
Задача в том, чтобы не было конкуренции за одни и те же записи, и не было ожиданий, пока освободятся блокировки.
Приведенный набор хинтов updlock, rowlock, nowait, readpast в MSSQL решает данную задачу.

Можно конечно пойти классическим путем: берем очередную запись и помечаем на удаление
Код: sql
1.
delete from table where id=...


но тогда запись блокируется, и если параллельная транзакция сделала такую же выборку и попыталась также удалить эту запись, то ей придется ждать результатов текущей транзакции.
Поэтому хочется как в MSSQL - сразу выбирать непересекающиеся наборы.
Ну ладно, пусть они даже пересекаются, главное не ждать.
Поможет ли команда
Код: sql
1.
set lock nowait

?
...
Рейтинг: 0 / 0
пессимистическая блокировка
    #39982088
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra,

Жуть какая.
Во первых, ETL делается на основе дат или чекпоинтов.
Во вторых, сначала пробуют настроить коммерческие ETL системы.
В третьих, если так сильно хочется делать мультипотоковый экстракт - ну задай разным роботам вытягивать данные из разных таблиц. Зачем их все на одну таблицу натравливать???

В общем, тебе очень сильно стоит пересмотреть подход к выгрузке данных. Очень-очень.
...
Рейтинг: 0 / 0
пессимистическая блокировка
    #39982132
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,
я ничего этого делать не буду. Во-первых, я не разработчик БД, а интегратор. Работаю с тем, что дали на вход.
Во-вторых, это не ETL. На выходе у меня не данные, а запуск бизнес процессов. Для простоты - JMS.
И параллельность тоже не моя прихоть, а данность. Она тут в основном для отказоустойчивости и непрерывности обработки.

Вот в этих условиях надо избежать конкуренции за одни и те же записи, желательно без сериализации.
...
Рейтинг: 0 / 0
пессимистическая блокировка
    #39982169
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, добрался до базы и проверил. Без всяких хинтов работает классический шаблон
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
begin tran
select top 10 from table where bla bla bla
-- потом в цикле по выбранным
delete from table where id=...  -- пометили на удаление
/* и дальше передаем эту строку в другие системы. Если в этот момент работает параллельная транзакция N2
с тем же набором данных, то на этот delete она не ждет завершения текущей транзакции N1,
а сразу возвращает update_count=0, и по этому признаку с данной строкой в транзакции N2 ничего не делаем,
и переходим к следующей. */
commit tran



Медленнее, чем с хинтами (в MSSQL), которые сразу возвращают непересекающиеся наборы данных, но главное без блокировок. Блокировок записей нет -> опасность дедлока отсутствует.
...
Рейтинг: 0 / 0
пессимистическая блокировка
    #39984263
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SELECT ... FOR UPDATE -- работает, есть везде.
...
Рейтинг: 0 / 0
пессимистическая блокировка
    #39984265
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra


Что это? Неправильный запрос или драйвер не справился? Используется jtds-1.3.1


Неправильны запрос.
...
Рейтинг: 0 / 0
пессимистическая блокировка
    #39984348
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv
SELECT ... FOR UPDATE -- работает, есть везде.

Увы, но речь идет о запросе с клиента. Это не курсор и не сохраненная процедура
...
Рейтинг: 0 / 0
пессимистическая блокировка
    #39989043
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra
MasterZiv
SELECT ... FOR UPDATE -- работает, есть везде.

Увы, но речь идет о запросе с клиента. Это не курсор и не сохраненная процедура


И?
...
Рейтинг: 0 / 0
пессимистическая блокировка
    #39989044
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra
В общем, добрался до базы и проверил. Без всяких хинтов работает классический шаблон
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
begin tran
select top 10 from table where bla bla bla
-- потом в цикле по выбранным
delete from table where id=...  -- пометили на удаление
/* и дальше передаем эту строку в другие системы. Если в этот момент работает параллельная транзакция N2
с тем же набором данных, то на этот delete она не ждет завершения текущей транзакции N1,
а сразу возвращает update_count=0, и по этому признаку с данной строкой в транзакции N2 ничего не делаем,
и переходим к следующей. */
commit tran



Медленнее, чем с хинтами (в MSSQL), которые сразу возвращают непересекающиеся наборы данных, но главное без блокировок. Блокировок записей нет -> опасность дедлока отсутствует.


Это
Код: sql
1.
2.
begin tran
select top 10 from table where bla bla bla



тебе не будет блокировать эти записи до конца транзакции.

Для этого нужно ещё добавить в SELECT фразу FOR UPDATE
...
Рейтинг: 0 / 0
пессимистическая блокировка
    #39989147
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,

SELECT FOR UPDATE - это первое, что я попробовал. Сервер сообщает, что такой селект может использоваться только в объявлении курсора или в теле хранимой процедуры. Возможно, есть какие-то настройки в конфигурации сервера, открывающие возможность использования этого выражения в обычном клиентском запросе, но я уже написал выше, что мне они недоступны.
Что касается классического шаблона блокировки записи, то она достигается не селектом, а удалением. Как это работает - написано в длинном комментарии выше.
...
Рейтинг: 0 / 0
пессимистическая блокировка
    #39996945
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra
MasterZiv,

SELECT FOR UPDATE - это первое, что я попробовал. Сервер сообщает, что такой селект может использоваться только в объявлении курсора или в теле хранимой процедуры. Возможно, есть какие-то настройки в конфигурации сервера, открывающие возможность использования этого выражения в обычном клиентском запросе, но я уже написал выше, что мне они недоступны.
Что касается классического шаблона блокировки записи, то она достигается не селектом, а удалением. Как это работает - написано в длинном комментарии выше.


Чего-чего?
Ты может быть привещёшь полный текст запроса, полностью сообщение об ошибке?
...
Рейтинг: 0 / 0
пессимистическая блокировка
    #39998300
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,

Код: sql
1.
select top 10 from mytable for update


Код: plaintext
1.
Error code 7305
FOR UPDATE can not be used in a SELECT which is not part of the declaration of a cursor or which is not inside a stored procedure.
...
Рейтинг: 0 / 0
пессимистическая блокировка
    #39999186
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra
MasterZiv,

Код: sql
1.
select top 10 from mytable for update


Код: plaintext
1.
Error code 7305
FOR UPDATE can not be used in a SELECT which is not part of the declaration of a cursor or which is not inside a stored procedure.


А, это да, ну так и объяви курсор, или в процедуре сделай.
Про то, что надо транзакцию открыть, наверное, не надо напоминать...
...
Рейтинг: 0 / 0
пессимистическая блокировка
    #39999190
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra,

Да, и надо было наверное сразу ещё сказать про достаточно распространённый трюк -- фиктивный update нужных строк в начале транзакции. Его можно делать вместо SELECT ... FOR UPDATE
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / пессимистическая блокировка
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (10): Анонимы (7), Bing Bot, Yandex Bot, Google Bot 8 мин.
x
x
Закрыть


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