Транзакции похожи на большие запросы?
Я знаю, что с точки зрения эффективности лучше иметь один большой запрос вместо множества мелких, так как лучше уменьшить количество соединений с базой данных до минимума (особенно в контексте интенсивного сетевого трафика).
Поэтому мой вопрос заключается в том, что помимо изоляции и дробления набора манипуляций с базой данных (и выполнения отката в случае сбоя одной из них) транзакция действует как большой запрос? Я имею в виду, если вам нужно сделать много манипуляций с базой данных, можете ли вы обернуть это в транзакцию и превратить в одну большую операцию?
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;
Проблема с этим подходом: вы заблокируете некоторые ресурсы, и это плохо для параллелизма. и если у вас есть одна ошибка в одном запросе, откат будет огромным.
Я стараюсь избегать транзакций, и иногда мне нужно реализовать какие-то компенсационные транзакции, если это возможно.
если вам нужно сделать много манипуляций с базой данных, можете ли вы обернуть ее в транзакцию и превратить в одну большую операцию
Да. Эта операция будет атомарной, как одно обновление строки.
С точки зрения дискового ввода / вывода: возможно (в зависимости от размера транзакции и множества других факторов). С точки зрения сетевого ввода-вывода, о котором вы спрашиваете: Нет. Транзакции осуществляются на стороне сервера.