Имеет ли использование транзакции, но не выполнение каких-либо запросов, стоимость ресурсов? - PullRequest
3 голосов
/ 29 апреля 2019

Хорошо, поэтому один из членов нашей команды предложил, чтобы в начале каждого http-запроса мы начинали транзакцию с БД (мы используем Entity Framework Core), выполняли работу с запросом, а затем выполняли транзакцию, если ответ200 Хорошо, или откат, если это что-то еще.

Это означает, что мы будем фиксировать только успешные запросы.

Это хорошо, когда мы выполняем чтение и запись в БД.

Однако мне интересно, если это произойдет, если мы на самом деле не делаем никаких операций чтения или записи в базу данных?

Ответы [ 2 ]

2 голосов
/ 01 мая 2019

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

Если вы используете обычные транзакции EF, то пустая транзакция попадет в базу данных три раза:

  1. BEGIN TRAN
  2. COMMIT
  3. Сброс соединения для пула соединений

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

Я бы все же посоветовал против этого.По моему опыту, веб-приложения требуют большей гибкости, чем 1: 1 соответствие веб-запроса и транзакции.Кроме того, правило использования кода состояния HTTP для определения транзакции окажется негибким.

Кроме того, вы должны выбрать уровень изоляции (и, возможно, время ожидания) для каждой транзакции.В начале HTTP-запроса неизвестно, каковы правильные значения.Только действие знает.

У меня был хороший опыт использования одного контекста EF на HTTP-запрос, а затем ручного использования транзакций внутри каждого действия.Накладные расходы с точки зрения LOC очень малы.Нет необходимости в централизации.

0 голосов
/ 19 июня 2019

Не вслепую ставьте BEGIN...COMMIT вокруг всего.Бывают случаи, когда это просто неправильно .

Что если веб-страница регистрирует присутствие пользователя или загрузку конкретной страницы?Наличие ROLLBACK уничтожает эту информацию.

Что если на странице есть два действия, и они не зависят друг от друга?То есть ROLLBACK для одного - это нормально, но вы хотите COMMIT для другого?

Что делать, если на странице нет записей?Тогда нет необходимости в BEGIN...COMMIT.

...