В настоящее время на блок приходится около 3–4000 транзакций, но в начале этого года их число достигало 1000. Изучая исходный код Spring, вы найдете множество уровней или режимов распространения, которые можно подключить к методу @Transactional. Ваш UserService проксируется на лету, и прокси управляет транзакциями для вас. Но не сам прокси управляет всем этим транзакционным состоянием (открыть, зафиксировать, закрыть), прокси делегирует эту работу менеджеру транзакций. Посмотрите на следующий исходный код и скажите мне, какой тип UserService автоматически конструирует Spring, предполагая, что он помечен @Transactional на уровне класса или имеет на уровне метода внутри класса конфигурации.
Spring создает для вас транзакционный прокси UserService, но как только вы оказываетесь внутри класса UserService и вызываете другие внутренние методы, прокси больше не задействован. Это означает, что новой транзакции не будет. Уровни изоляции базы данных, однако, являются сложной темой, и вам следует потратить некоторое время, чтобы полностью разобраться в них. Хорошим началом является официальная документация Postgres и ее раздел об уровнях изоляции.
Более того, прямое использование не обязательно связано с «затратами» воды, поскольку большая часть воды в методах охлаждения используется повторно. И косвенное потребление (источником электроэнергии) также технически не является «затратами», поскольку большая часть воды, используемой тепловыми электростанциями, после охлаждения возвращается в источник . Отключение майнеров Bitcoin существенно не повлияет на воду, используемую для выработки гидроэлектроэнергии. Во-первых, де Врис пытается подсчитать потребление воды на одну транзакцию . Также обратите внимание, что когда речь идет о переключении уровней изоляции во время транзакции, вы должны обязательно проконсультироваться о вашем драйвере JDBC/базы данных, чтобы понять, какие сценарии поддерживаются, а какие нет. Spring создаёт здесь динамический CGLib-прокси вашего класса UserService, который может открывать и закрывать транзакции базы данных для вас.
Помните об этом как о дополнительных нюансах для "логической обработки транзакций". В разделе "Обычный JDBC" я показал вам всё, на что способен JDBC, когда речь идёт о транзакциях. Потратьте минуту, чтобы подумать о том, что каждый отдельный режим распространения в Spring в итоге НА САМОМ ДЕЛЕ делает с вашим источником данных или, скорее, с вашим соединением JDBC. Таким образом, менеджер транзакций источника данных использует при управлении транзакциями точно такой же код, который вы видели в разделе JDBC. Вы должны иметь приблизительное представление об ACID, то есть о том, что такое транзакции баз данных и зачем их использовать.
Одной операции всегда соответствует одна транзакция, но в рамках одной транзакции можно совершить несколько операций (например, несколько разных insert можно сделать, или изменить и удалить данные...). Если говорить по-научному, то транзакция — упорядоченное множество операций, переводящих базу данных из одного согласованного https://maxipartners.com/ состояния в другое. Согласованное состояние — это состояние, которое подходит под бизнес-логику системы. То есть у нас не остается отрицательный баланс после перевода денег, номер счета не «зависает в воздухе», не привязанный к человеку, и тому подобное. Транзакция — это тот же архив для запросов.
Поэтому важно сделать rollback, если изменения сохранять не надо. Его возьмет кто-то другой и сделает коммит. Чтобы отправить транзакцию к базе, нам нужно создать соединение с ней. Соединение называют также коннект (англ connection) — это просто труба, по которой отправляются запросы.
И вся фишка транзакционной базы в том, что база сначала применяет запрос «виртуально», реально ничего в базе не изменив. Ты можешь посмотреть, как запрос изменит базу, ничего при этом не сохраняя. Как только мы закрыли транзакцию, труба освободилась. И ее можно переиспользовать, отправив следующую транзакцию.
Вместо этого, все дело в декларативном управлении транзакциями. Можно, конечно, каждый раз закрывать соединение с БД. Но эффективнее переиспользовать текущие. Потому что создание нового коннекта — тяжелая операция, долгая. Как я уже сказал выше, теперь всем нам предстоит дать этому отпор.
Воду, используемую на месте, можно сохранить для других целей, если майнеры Bitcoin отключатся. Вода, используемая электрогенераторами, не обязательно. Это два совершенно разных типа водопользования, которые нельзя объединить в ONE удобную, но неактуальную меру. К этому моменту вы должны иметь довольно хорошее представление о том, как управление транзакциями работает с фреймворком Spring и как оно применяется к другим библиотекам Spring, таким как Spring boot или Spring WebMVC. Самым главным выводом должно быть то, что в конечном итоге не имеет значения, какой фреймворк вы используете, все дело в основах JDBC. Давайте вернемся к разделу "Прокси" этого руководства.