Транзакции похожи на большие запросы?

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

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

4 ответа

Решение

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

В рамках транзакции отдельные запросы выполняются отдельно.

И не всегда лучше или эффективнее иметь "один большой запрос вместо множества маленьких". Это зависит от того, какие запросы. Более эффективно запрашивать набор строк в одном большом запросе, а не запрашивать их по одной за раз. Я действительно видел код, который делает это (псевдокод):

SELECT id FROM people WHERE ... ORDER BY lastname;

for each (id) {
    SELECT firstname, lastname, phone from people WHERE id = {id};
    ...
}

Это было бы намного эффективнее, как

SELECT id, firstname, lastname, phone FROM people WHERE ... ORDER BY lastname;

Проблема с этим подходом: вы заблокируете некоторые ресурсы, и это плохо для параллелизма. и если у вас есть одна ошибка в одном запросе, откат будет огромным.

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

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

Да. Эта операция будет атомарной, как одно обновление строки.

С точки зрения дискового ввода / вывода: возможно (в зависимости от размера транзакции и множества других факторов). С точки зрения сетевого ввода-вывода, о котором вы спрашиваете: Нет. Транзакции осуществляются на стороне сервера.

Другие вопросы по тегам