Есть ли какие-либо веские причины для того, чтобы ваше приложение не рассматривало какие-либо транзакции? - PullRequest
2 голосов
/ 01 июня 2011

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

Возник вопрос при разговоре с dba, который очень нервничает, когда я поднимаю spring / hibernate.Я упоминаю, что Spring может обрабатывать транзакции при использовании таблиц отображения Hibernate с объектами и т. Д., И возникает проблема, заключающаяся в том, что база данных (Oracle10g) уже обрабатывает управление транзакциями, поэтому мы должны просто использовать это.Он даже предложил идею, что мы создаем кучу процедур БД для вставки / обновления, чтобы база данных могла обрабатывать вещи более эффективно, возвращая 0/1 от того, сработала ли вставка / обновление.

Есть ли какие-либовеские причины для того, чтобы ваше приложение не обрабатывало транзакции?Является ли мой DBA невежественным?Я думаю, что он есть, но я не очень хороший оратор, когда я не уверен в ответе ... вот почему я ищу ответ.

Ответы [ 3 ]

5 голосов
/ 01 июня 2011

Я думаю, здесь есть какое-то недопонимание.

Дело в том, что база данных не управляет транзакциями в том же смысле, что и Spring / Hibernate.

База данных «управляет транзакциями», обеспечивая поведение транзакций, а ваше приложение «управляет транзакциями», используя это поведение и определяя границы транзакций (в частности, с помощью Spring или Hibernate).

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

3 голосов
/ 01 июня 2011

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

Существует также аргумент (в отношении сценариев транзакций), что он быстрее, потому что меньше циклов, у вас есть один вызов хранимой процедуры, которая выполняет и выполняет все и возвращает результат, в отличие от вашего обычногоПриложение Spring / Hibernate, где у вас есть несколько запросов или обновлений, и каждый оператор передается по сети в базу данных (хотя Hibernate кэширует и переупорядочивает, чтобы попытаться минимизировать это).Минимизация сетевых обходов, вероятно, является наиболее веской причиной такого подхода. Вам нужно взвесить, стоит ли жертвовать гибкостью ради сокращения сетевого трафика или это преждевременная оптимизация.

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

Итак, резюмируем, вот аргументы для сценариев транзакций:

  • Меньше сетевого трафика

  • Недорогие разработчики

  • полный контроль DBA (с вашей точки зрения, он будет полным узким местом)

0 голосов
/ 01 июня 2011

Как упомянуто выше, нет способа "использовать транзакции" с точки зрения базы данных без уведомления вашего приложения об этом на уровне некотором . Хотя, если вы используете Spring, вы можете сделать это довольно безболезненно, используя <tx:annotation-driven> и применяя аннотации @Transactional к соответствующим методам в классах реализации сервиса.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...