MS SQL не записывает все транзакции - PullRequest
0 голосов
/ 24 января 2019

Я использую базу данных Sql Server для записи журналов моей игры. Каждый ход записывается в конкретную таблицу. Я использую хранимую процедуру для записи журналов, около 50 тысяч журналов в день.

Недавно я заметил, что он не записывает все представленные журналы. В некоторые дни у меня есть только 2000 журналов, а в некоторые дни у меня 100 000. Я не могу найти ничего плохого в моем коде, чтобы вызвать это.

Сколько вызовов хранимой процедуры можно выполнить за секунду?
В чем причина отказа от стольких звонков?
Что я могу сделать, чтобы убедиться, что все вызовы вставляются в таблицу?
Поможет ли это использовать обычные вызовы, а не вызовы хранимых процедур?

1 Ответ

0 голосов
/ 24 января 2019

Сколько вызовов хранимой процедуры можно выполнить за секунду?

Immaterial. Ваша СУБД не «теряет» транзакции из-за перегруженности.

В чем может быть причина отказа от стольких звонков?

Какие у вас есть доказательства того, что даже один звонок сбрасывается? Вы не упомянули ни одного.

Что я могу сделать, чтобы убедиться, что все вызовы вставляются в таблицу?

Ищите места, где ваша транзакция не совершается.

Поможет ли это использовать обычные вызовы, а не вызовы хранимых процедур?

Нет, наоборот. Хранимые процедуры более эффективны и предоставляют вам функции безопасности, которые иначе недоступны.

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

Первое, что я проверю, это свойство соединения, которое определяет, является ли COMMIT явным или неявным. Если для соединения , а не требуется явная фиксация из приложения, то каждый INSERT фиксируется атомарно. Это похоже на то, что вы хотели бы для таблицы журнала.

Что вы можете сделать, это создать «таблицу журнала регистрации» и вставлять в нее каждый раз, когда вы вызываете хранимую процедуру, и снова каждый раз, когда она завершается, со временем и состоянием. Убедитесь, что обновления таблицы журнала не являются частью какой-либо более крупной транзакции, которая может быть откатана. Проверьте это, проверив @@trancount. Верните ошибку, если она больше 1, и убедитесь, что вы правильно записываете ошибки. Если вы включите ключевую информацию в свою таблицу журналов, вы можете сравнить ее с основной таблицей, чтобы узнать, кому чего не хватает. Могу поспорить, это покажет улики.

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

Вы правы в одном: если обновления поступают по сети, есть вероятность, что соединение обрывается. Если он будет удален до фиксации, это объяснит потерянные обновления, потому что вставка откатывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...