Sybase/JDBC: как обнаружить реорганизации или эксклюзивные блокировки?
Мы используем сервер Sybase ASE (15.5) в качестве нашей БД, и у нас возникают странные, периодически возникающие проблемы с блокировкой SPID, которые я пытаюсь обнаружить и программно устранить на уровне приложений.
Sybase позволяет вам планировать так называемые "перераспределения", которые, как я могу сказать, являются периодическими переиндексациями / уплотнением таблиц, очистками и т. Д. В основном, запланированное обслуживание БД.
Время от времени мы приводим все планеты в соответствие друг с другом, где:
- Запрос выполняется (создание SPID в Sybase) и по какой-то причине зависает. Это устанавливает (блокирует) общую блокировку, скажем,
widgets
Таблица; затем - Запланированный реорг начинается, и хочет очистить
widgets
Таблица. Реорг размещает эксклюзивный запрос на блокировкуwidgets
, но не могу получить блокировку, потому чтоwidgets
уже заблокирован и заблокирован зависшим SPID/ запросом; затем - Последующие запросы выполняются, каждый запрашивает общую блокировку на
widgets
; такой, что - Вся система теперь связана: реорг не может начаться, пока он не получит эксклюзивную блокировку на
widgets
, ноwidgets
связан в блокируемой общей блокировке зависшим SPID. И потому что реорг установил эксклюзивный замок наwidgets
все остальные запросы, требующие общих блокировокwidgets
придется подождать, пока перезапуск не будет завершен (поскольку вновь запрошенная эксклюзивная блокировка превосходит вновь запрошенную общую блокировку).
Я думаю, что моя идеальная стратегия заключается в следующем:
- Тайм-аут запросов БД после, скажем, 2 минуты, что предотвратит зависание SPID и, таким образом, предотвратит запуск повторных команд; а потом
- Если запрос пытается поразить таблицу, которая имеет эксклюзивную блокировку, определите это и особым образом его обрабатывайте (например, запланируйте повторный запрос на 1 час позже, когда, как мы надеемся, реорганизация завершена и т. Д.)
Мои вопросы:
- Как тайм-аут запроса на снятие общей блокировки, скажем, через 2 минуты?
- Есть ли способ программно (скорее всего, через драйвер Sybase JDBC, но, возможно, через командную строку Sybase, HTTP-вызовы и т. Д.) Определить, выполняется ли реорг? Или эта эксклюзивная блокировка существует на столе? Таким образом, я мог обнаружить эксклюзивный замок и обработать его особым образом.
Заранее спасибо!
1 ответ
Вы можете получить команды, которые выполняются в базе данных, с помощью следующего запроса:
select cmd from sysprocesses
Чтобы найти информацию о блокировке вы можете присоединиться master..syslocks
а также your_db..sysobjects
выяснить, какие блокировки существуют на объекте, к которому вы пытаетесь получить доступ. syslocks.type
указывает на тип блокировки, и эти возможные значения можно найти здесь:
select object_name(id), db_name(dbid), type from master..syslocks
where dbid = db_id("your_db")
Надеюсь, это поможет.
Чтобы выяснить, связана ли блокировка с реоргом, я думаю, что вы сможете присоединить syslocks.spid к sysprocesses.spid, где cmd = "REORG" или что-то вроде:
select p.cmd, p.spid, l.type from master..sysprocesses p, master..syslocks l where CMD = "REORG"