Как именно это работает, зависит от базы данных.Например, в Oracle для этого потребуется пространство UNDO (и, в конце концов, если вы закончите, ваша транзакция будет прервана или ваш DBA будет кричать на вас).В PostgreSQL это предотвратит очистку старых версий строк.В MySQL / InnoDB он будет использовать пространство отката и, возможно, вызовет таймауты блокировки.
Есть несколько вещей, для которых база данных должна использовать пространство для:
- Хранение строк, в которых находится ваша транзакцияизменен (старые значения, новые значения или оба), чтобы можно было выполнить откат
- Отслеживание того, какие данные видны для вашей транзакции, чтобы обеспечить согласованное представление (на уровнях изоляции транзакций, отличных от чтениянезавершенный).Эти издержки часто будут тем больше, чем больше изоляции вы запрашиваете.
- Отслеживание того, какие данные видны для других транзакций (если вся база данных не выполняется при чтении без передачи)
В общем, вы хотите, чтобы ваши транзакции фиксировались как можно скорее.Так, например, вы не хотите держать один открытый на свободном соединении.Как лучше всего выполнить пакетную вставку, зависит от базы данных (часто многие вставки в одной транзакции лучше, чем одна транзакция на одну вставку).И, конечно же, основная цель транзакций - целостность данных.