2015-12-21 3 views
1

Мое приложение работает на EJB 1.1 на Jboss 2.4 и использует Sybase. В последнее время мы сталкиваемся с проблемой, когда на конкретной таблице есть неопределенные блокировки, и это привело к тому, что последующие запросы ожидают блокировки, чтобы их освободили, и поэтому полное приложение не работает. Администратор БД утверждает, что приложение не выпускает никаких блокировок, и мы не внесли никаких изменений в код, относящийся к этой конкретной таблице. Мой вопрос в том, есть ли какие-либо общие проблемы с Jboss 2.4, которые необходимо проверить или какие-то конкретные области, которые нужно искать?Замки, не выпущенные в Sybase ASE

Выполняемый мной запрос - это просто простые операторы select/update с изоляцией транзакций read_committed. Я получаю соединение из пула jboss и выполняю выбор или обновление, а затем закрываю соединение, оператор и набор результатов.

Почему проблема возникает случайно?

Прошу прощения, я не могу предоставить какой-либо код.

+1

Чтобы добавить к ответу ниже, блокировки также могут быть настроены на основе таблицы, если вы не хотите изменять сервер в целом. При использовании datarows есть дополнительные накладные расходы, поэтому, если у вас есть только проблемы с таблицами с парами, вам может потребоваться изменить только эти таблицы. http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.dc20021_1251/html/locking/X12029.htm –

+0

Я бы предложил запросить администратор базы данных для всей информации о блокирующем соединении.Предполагая, что эта СУБД является Sybase ASE, а не ASA или другой, блокировки могут запрашиваться в syslocks, где может быть получен идентификатор соединения (spid) процесса блокировки. Из spid информация доступна в sysprocesses: время начала, пользователь и информация, зависящая от приложения. Собирая все, возможно, это позволяет идентифицировать транзакцию jboss и делать выводы. – Corral

ответ

2

У меня были те же симптомы, что и две транзакции одновременно для Sybase ASE.

Трудно дать твердый ответ, не видя ни одного вашего кода, и только чтение о симптомах, но настройка схемы блокировки должна сделать трюк.

Предложенное исправление:

По умолчанию схемы блокировки для Sybase ASE является «AllPages», который я нашел, чтобы быть склонными к запиранию. Чтобы устранить взаимоблокировки, используйте более мелкозернистый механизм блокировки (например, «datarows»).

Чтобы настроить lock scheme:

sp_configure "lock scheme", 0, datarows 

Ссылки:

Edit:

В комментариях Майкл Гарднер отметил, что это может быть изменено на основе таблицы, что дает вам возможность не менять схему блокировки на весь ваш сервер и будет нести накладные расходы на блокировку, если вы знаете, какие таблицы дают вам проблемы.

alter table table_name lock datarows 
+1

Я бы также предложил добавить изменение схемы блокировки на отдельные таблицы с помощью «alter table» к вашему ответу. При использовании datarows возникают дополнительные накладные расходы, поэтому, если возникают только несколько таблиц, может быть нецелесообразно изменять схему на всем сервере. Проверьте ссылку в моем комментарии выше, чтобы получить синтаксис –

+0

@MichaelGardner Спасибо! Я обновил свой ответ с вашим предложением. –

1

Похоже, там может быть открыта транзакция, которая не совершает? Мастер запросов ..syslogshold, чтобы получить ясность.

+0

привет, возможно ли вы можете проверить этот вопрос? http://stackoverflow.com/questions/34995600/sybase-alternative-way-for-error-to-catch-error – Moudiz

Смежные вопросы