Sybase/JDBC: как обнаружить реорганизации или эксклюзивные блокировки?

Мы используем сервер Sybase ASE (15.5) в качестве нашей БД, и у нас возникают странные, периодически возникающие проблемы с блокировкой SPID, которые я пытаюсь обнаружить и программно устранить на уровне приложений.

Sybase позволяет вам планировать так называемые "перераспределения", которые, как я могу сказать, являются периодическими переиндексациями / уплотнением таблиц, очистками и т. Д. В основном, запланированное обслуживание БД.

Время от времени мы приводим все планеты в соответствие друг с другом, где:

  1. Запрос выполняется (создание SPID в Sybase) и по какой-то причине зависает. Это устанавливает (блокирует) общую блокировку, скажем, widgets Таблица; затем
  2. Запланированный реорг начинается, и хочет очистить widgets Таблица. Реорг размещает эксклюзивный запрос на блокировку widgets, но не могу получить блокировку, потому что widgets уже заблокирован и заблокирован зависшим SPID/ запросом; затем
  3. Последующие запросы выполняются, каждый запрашивает общую блокировку на widgets; такой, что
  4. Вся система теперь связана: реорг не может начаться, пока он не получит эксклюзивную блокировку на widgets, но widgets связан в блокируемой общей блокировке зависшим SPID. И потому что реорг установил эксклюзивный замок на widgetsвсе остальные запросы, требующие общих блокировок widgets придется подождать, пока перезапуск не будет завершен (поскольку вновь запрошенная эксклюзивная блокировка превосходит вновь запрошенную общую блокировку).

Я думаю, что моя идеальная стратегия заключается в следующем:

  • Тайм-аут запросов БД после, скажем, 2 минуты, что предотвратит зависание SPID и, таким образом, предотвратит запуск повторных команд; а потом
  • Если запрос пытается поразить таблицу, которая имеет эксклюзивную блокировку, определите это и особым образом его обрабатывайте (например, запланируйте повторный запрос на 1 час позже, когда, как мы надеемся, реорганизация завершена и т. Д.)

Мои вопросы:

  1. Как тайм-аут запроса на снятие общей блокировки, скажем, через 2 минуты?
  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")

http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc36274.1550/html/tables/X16427.htm

Надеюсь, это поможет.

Чтобы выяснить, связана ли блокировка с реоргом, я думаю, что вы сможете присоединить syslocks.spid к sysprocesses.spid, где cmd = "REORG" или что-то вроде:

select p.cmd, p.spid, l.type from master..sysprocesses p, master..syslocks l  where CMD = "REORG"
Другие вопросы по тегам