2013-07-09 6 views
2

Я использую ASE 15.0.3 и имею проблемы с процессом java, который каждый раз, а затем генерирует исключение при попытке выполнить пакетную вставку (через sql-запрос и не хранимую процедуру) в таблице. Ниже приведено исключение: JZ0BE: BatchUpdateException: Error occurred while executing batch statement: Your server command (family id #0, process id #61) encountered a deadlock situation. Please re-run your command.Sybase Batch insert deadlock

Таблица, в которую он пытается вставить, имеет много столбцов, но только один (некластеризованный) индекс в столбце id (int identity).

Другие (параллельные) процессы, которые взаимодействуют с этой таблицей можно выполнить один из 2-х вещей:

1) Select data from the table (transaction based) 

2) Delete data from the table (transaction based, and first requiring an 
exclusive table lock with wait 20 sec). 

догадка, что тупик приходит со страниц индекса. Невозможно преобразовать механизм блокировки для страниц данных или DataRows поскольку таблица содержит много больших переменных CHARS столбцов, что все добавить до более чем 8191 байт и отображает: ... exceeds limit of 8191 bytes for column-offset of variable-length columns in DOL tables. Future inserts to this table may fail.

Любые идеи о том, как эту ситуацию можно избежать? (кроме удаления индекса из таблицы).

Благодаря

+1

Вы можете включить регистрацию в тупик в журнал ошибок и выяснить, что именно зашло в тупик. Таблицы MDA могут делать то же самое, но я знаю, что можно найти полезную информацию из errorlog. Будет ли это SELECT, как с другой стороны? Потому что эксклюзивная блокировка стола не должна участвовать в тупике. Но если это так, я вижу, что DOL желательно, но вы застряли там. Можете ли вы уловить ошибку и повторно отправить ее? Похоже, вы уже решили против этого. –

+0

, когда я впервые проверил журналы ... ничего не было, поэтому регистрация должна быть отключена. С тех пор тупика не произошло, я посмотрю журнал в следующий раз. Он появляется редко, но он вызывает много дискомфорта, когда он это делает. – andreih

+0

было бы очень сложно добавить проверку сообщения об ошибке и автоматический повтор? –

ответ

0

На первом - у вас есть триггеры на столе? Если да - проверьте все таблицы на триггере. Какую схему блокировки вы используете для этой таблицы? Если это блокировка allpages - попробуйте изменить ее на datapage/datarow. Что касается исключения ограничения размера строки - я думаю, вам следует исследовать возможность разделения таблицы или изменения структуры таблицы ...