Большинство ответов здесь является некоторой формой "Вас, может легко выгрузить реализации", но что я думаю, что им не удается ответить, почему? часть. К этому я думаю, что ответ является почти окончательно тестируемостью. Независимо от того, используете ли Вы Spring, или любая другая платформа МОК, с помощью Внедрения зависимости делает код легче протестировать. В случае говорят, что писатель, а не PrinterWriter, можно Дразнить интерфейс Writer в Модульном тесте и удостовериться, что код называет его способом, к которому Вы ожидаете его. Если Вы зависите непосредственно от реализации класса, Ваша единственная опция состоит в том, чтобы идти к принтеру и проверить его, который не очень автоматизирован. Кроме того, если Вы зависите от результата вызова к классу, не быть способным Дразнить его может предотвратить Вас от способности достигнуть всех путей выполнения кода в Вашем тесте, таким образом уменьшая их качество (потенциально) Проще говоря, необходимо разъединить создание Графа объектов от прикладной логики. Выполнение так делает Ваш код легче протестировать.
Предполагая, что ваши таблицы правильно проиндексированы (и что вы действительно используете эти индексы - всегда стоит проверять через план запроса), вы можете попробовать взломать компоненты 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
Лучше всего для решения проблемы взаимоблокировки установить для параметра «Печать информации о взаимоблокировке» значение при использовании
sp_configure «Печать информации о взаимоблокировке», 1
Каждый раз, когда возникает взаимоблокировка, это будет вывести информацию о том, какие процессы были задействованы и какие sql выполнялись во время мертвой блокировки.
Если в ваших таблицах используется блокировка всех страниц. Это может уменьшить количество взаимоблокировок, чтобы переключиться на блокировку строк данных или страниц данных. Если вы это сделаете, обязательно соберите новую статистику по таблицам и воссоздайте индексы, представления, хранимые процедуры и триггеры, которые обращаются к измененным таблицам. Если вы этого не сделаете, вы либо получите ошибки, либо не увидите всех преимуществ изменения, в зависимости от того, какие из них не будут воссозданы.
У меня есть набор долгосрочных приложений, которые иногда прерывают доступ к таблице кругов, и sybase выдает эту ошибку. Если вы проверите журнал сервера sybase, он предоставит вам полную информацию о том, почему это произошло. Например: sql, в котором участвовали два процесса, пытающиеся получить блокировку. Обычно один пытается прочитать, а другой делает что-то вроде удаления. В моем случае приложения работают в отдельных JVM, поэтому синхронизация невозможна, просто нужно периодически очищать.