Sybase ASE: “Ваша команда сервера встретилась с ситуацией с мертвой блокировкой”

Большинство ответов здесь является некоторой формой "Вас, может легко выгрузить реализации", но что я думаю, что им не удается ответить, почему? часть. К этому я думаю, что ответ является почти окончательно тестируемостью. Независимо от того, используете ли Вы Spring, или любая другая платформа МОК, с помощью Внедрения зависимости делает код легче протестировать. В случае говорят, что писатель, а не PrinterWriter, можно Дразнить интерфейс Writer в Модульном тесте и удостовериться, что код называет его способом, к которому Вы ожидаете его. Если Вы зависите непосредственно от реализации класса, Ваша единственная опция состоит в том, чтобы идти к принтеру и проверить его, который не очень автоматизирован. Кроме того, если Вы зависите от результата вызова к классу, не быть способным Дразнить его может предотвратить Вас от способности достигнуть всех путей выполнения кода в Вашем тесте, таким образом уменьшая их качество (потенциально) Проще говоря, необходимо разъединить создание Графа объектов от прикладной логики. Выполнение так делает Ваш код легче протестировать.

6
задан Danny Beckett 14 March 2013 в 04:59
поделиться

3 ответа

Предполагая, что ваши таблицы правильно проиндексированы (и что вы действительно используете эти индексы - всегда стоит проверять через план запроса), вы можете попробовать взломать компоненты SP и заключить их в отдельные транзакции, чтобы каждая единица работы была завершена до начала следующей.

 begin transaction 
   update mytable1 
     set mycolumn = "test"
   where ID=1

 commit transaction
 go

 begin transaction 
  insert into mytable2 (mycolumn) select mycolumn from mytable1 where ID = 1
 commit transaction
 go
0
ответ дан 10 December 2019 в 02:52
поделиться

Лучше всего для решения проблемы взаимоблокировки установить для параметра «Печать информации о взаимоблокировке» значение при использовании

sp_configure «Печать информации о взаимоблокировке», 1

Каждый раз, когда возникает взаимоблокировка, это будет вывести информацию о том, какие процессы были задействованы и какие sql выполнялись во время мертвой блокировки.

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

7
ответ дан 10 December 2019 в 02:52
поделиться

У меня есть набор долгосрочных приложений, которые иногда прерывают доступ к таблице кругов, и sybase выдает эту ошибку. Если вы проверите журнал сервера sybase, он предоставит вам полную информацию о том, почему это произошло. Например: sql, в котором участвовали два процесса, пытающиеся получить блокировку. Обычно один пытается прочитать, а другой делает что-то вроде удаления. В моем случае приложения работают в отдельных JVM, поэтому синхронизация невозможна, просто нужно периодически очищать.

2
ответ дан 10 December 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: