Я изучаю проблему с нашим сайтом, который использует SQL-сервер для управления сеансами. Веб-сайт - это веб-формы asp.net, основанные на CMS sitecore. У нас есть тот же код в разных средах, например. QA, постановка и производство.
В производстве, что мы видим, периодически мы получаем быстро растущее использование ЦП, которое никак не коррелирует с трафиком на сервер. Наряду с этим пиком CPU мы видим соответствующий всплеск сетевого ввода-вывода.
Наше программное обеспечение для мониторинга не проводит различия между трафиком в Интернете и трафиком на сервер БД; однако то, что мы видим на сервере БД, составляет буквально сотни вызовов в секунду до dbo.TempGetStateItemExclusive3
в базе данных сеанса asp, все для одного и того же идентификатора сеанса, и никакое соответствующее количество запросов страниц, поступающих в веб-серверов.
С тем же кодом и конфигурацией мы просто не видим этого поведения для других сред. Мы также не видим его для других идентификаторов сеансов, только для этого конкретного.
Удаление строки из базы данных просто приводит к ее воссозданию с тем же идентификатором сеанса.
ОБНОВЛЕНИЕ
Я нашел эту ошибку в журнале событий:
Violation of PRIMARY KEY constraint 'PK__ASPState__C9F49290145C0A3F'. Cannot insert duplicate key in object 'dbo.ASPStateTempSessions'. The duplicate key value is (sessionidwiththeproblem). The statement has been terminated.
Stack trace:
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean\ breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand\ cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler,\ TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,\ RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,\ RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,\ RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult\ result, String methodName, Boolean sendToPipe)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at System.Web.SessionState.SqlSessionStateStore.SqlExecuteNonQueryWithRetry(SqlCommand\ cmd, Boolean ignoreInsertPKException, String id)
Любые идеи о том, как можно было бы создать дублирующийся идентификатор сеанса?