Spring, Hibernate, MySQL - как работают транзакции - Заключение / Вопросы ** - PullRequest
5 голосов
/ 11 мая 2011

Я работаю с Spring Framework 3.0.5, Hibernate 3.6 и MySQL Server 5.1.У меня есть несколько вопросов, касающихся управления транзакциями в целом.Я лично использую декларативное управление транзакциями с весны.Было бы здорово, если бы вы могли ответить на мои вопросы с да / нет (или правильно / неправильно) и, возможно, при необходимости, дать короткие объяснения.Было бы неплохо, если бы несколько человек ответили, если есть разные мнения.Спасибо: -)

1) Вы бы сказали, что это предложение верно: СУБД отвечает за общую реализацию транзакций и их поведение.

1) B) Может быть, было бы лучше сказать: СУБД отвечает за общую реализацию транзакций и поведение базы данных (например, при откате транзакции).

2) Hibernate просто использует соединение с базой данных.Ему нужны транзакции, но он не конфигурирует никаких (!) Настроек, касающихся транзакций и их поведения.

3) Но: для работы с транзакциями Hibernate необходимо ЗНАТЬ, где начинаются транзакции,зафиксированы и требуют отката.

4) Нужно ли Hibernate знать, что происходит в случае отката?Я думаю нет, потому что это должно быть определено в СУБД.(это означает: какие таблицы должны быть заблокированы, какие операции с базами данных должны быть отменены и т. д., правильно?)

5) Для 3) , программныйили можно использовать декларативное управление транзакциями.

6) При использовании программного управления транзакциями все, что нужно знать Hibernate ( 3) ), может быть написано разработчиком в исходном коде вручную.

7) Для декларативного управления транзакциями необходима дополнительная среда для гибернации, FOR EXAMPLE Spring.

8) Spring управляет транзакциями.Это как рамка для них.Он запускает действия, такие как запуск и откат транзакции.

9) Spring также может определить, для каких исключений откат должен или не должен произойти

10) Есть ли у Spring какие-то дополнительные вещи, когда происходит откат?Я думаю, что база данных ответственна за откат, весна только вызывает это, правильно?Это просто чтобы убедиться ....

Спасибо: -)


[РЕДАКТИРОВАТЬ] Это ответ на duffymo, это было слишком долго для комментария, и я неразрешено ответить на мой вопрос в течение 8 часов, поэтому сейчас я должен поставить его здесь.Извините.

@ duffymo

Интересные ответы, вот мои мысли по этому поводу:

  1. Итак, мы согласны, что поведение базы данных (изКонечно!) В случае, если транзакции откатаны или зафиксированы, реализованы или определены непосредственно СУБД, правильно?Я знаю Менеджер транзакций (PlatformTransactionManager), но я действительно думаю, что он просто инициирует транзакции, откат и фиксацию.Это означает, что он не отвечает за то, КАК транзакции обрабатываются базой данных, правильно?Я думаю, что моя вербализация была ошибочной, я обновил ее (1B)

  2. Это немного абстрактно для меня.Означает ли это, что мои предложения были правильными или нет: -)

  3. Как это может отметить это само по себе?Я думаю, что это должно быть сделано разработчиком?Я думаю о «start tx, commit ...», который может сделать разработчик в исходном коде

  4. Согласен. Это одна вещь, которую я нахожу немного трудной для понимания во всех этих документах. Они сообщают о том, какие транзакции отлавливаются, а какие нет, но для того, чтобы выяснить, как с ними обращаться, вы должны выяснить сами. Вначале я был сбит с толку, потому что не был уверен, смогу ли я даже окружить вызов аннотируемого транзакцией метода блоком try / catch, чтобы перехватить исключение и проинформировать пользователя. Просто недостаточно откатить транзакцию, мне нужно, чтобы пользователь был проинформирован. Вот почему я почти везде использую try / catch - как вы справляетесь с этим?

  5. Это один момент, который я не понимаю. Spring предлагает программное и декларативное управление транзакциями. Если Spring управляет транзакциями, то, конечно, используется декларативный transman. Программный ... в моих глазах .. просто программный. Я не уверен, что вы можете сказать «Hibernate == programmatic», потому что вы можете использовать Hibernate как с программным, так и с декларативным управлением транзакциями. Возможно, можно сказать, что hibernate не предлагает САМОГО декларативного управления транзакциями.

  6. Я даже не знал, что это можно сделать «в JDBC» - должен признать, что тогда я не знаю, как это работает в деталях. Как-то забавно, что во время чтения вы подумали, что я против использования декларативных транзакций (если я вас неправильно понял), я действительно ценю декларативное управление транзакциями. :-) Я думаю, что его очень легко использовать, и при чтении кода это очень понятно.

  7. Если я хочу использовать Hibernate с декларативным управлением транзакциями, мне нужна дополнительная инфраструктура, такая как Spring. Потому что декларативный означает, что дополнительный каркас «выполняет всю работу, которую вам придется делать программно». (например, запуск TX, фиксация, откат). И я также думаю, что Spring может быть не единственной платформой, которая предлагает декларативное управление транзакциями для hibernate. Но главное в моем вопросе было то, что невозможно использовать декларативное управление транзакциями для гибернации без использования дополнительного фреймворка. Надеюсь, теперь я правильно произнес это: -)

  8. хорошо, правильно. поэтому диспетчер транзакций запускает откат, начиная tx и т. д.

  9. хорошо ..

  10. извините: -)

Мне просто нравится понимать, как все работает. Я перечитываю документацию снова и снова, но если вы изучаете все самостоятельно, важно понимать основные факты. Вот почему я спрашиваю :-) Спасибо за вашу помощь! : -)

Ответы [ 2 ]

5 голосов
/ 11 мая 2011

Вот мое мнение:

  1. В конечном счете, поведение фиксации / отката выполняется в реляционной базе данных, но не совсем точно передать всю ответственность за базу данных.Когда вы используете Spring, JDBC и реляционную базу данных вместе, возникает элемент среднего уровня, который обычно называется диспетчером транзакций.
  2. Hibernate программно реализует логику транзакций в объектах.
  3. Hibernate помечаетначало и конец транзакции программным способом.
  4. Hibernate может захотеть узнать, откатывается ли транзакция;что еще более важно, ваше приложение должно знать, чтобы оно могло сообщать пользователям.
  5. Hibernate == programmatic;Spring == декларативный.
  6. Может быть написан разработчиком.Вы можете даже сделать все это в JDBC, если хотите.Но есть веские причины для декларативных транзакций.(Похоже, вы пытаетесь оправдать, что не используете их. Интересно, почему?)
  7. Не понимаете этого - перефразируйте его.
  8. Менеджеры транзакций заботятся о транзакциях.
  9. Spring выбросит соответствующие исключения, да.
  10. Кажется, вы повторяете одни и те же вопросы снова и снова.

Какова ваша реальная точка зрения здесь?Мне было бы интересно узнать.

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

// prototypical write operation
public void update(Connection connection) throws SQLException
{
    connection.setAutoCommit(false);
    try
    {
        // SQL logic here
        connection.commit();  // if you get here, success
    } 
    catch (SQLException e)
    {
        try { if (connection != null) connection.rollback(); } catch (SQLException e) {}
        // might do some other things here (logging, etc.)
        // sql error codes will tell you why; spring translates these for you.
    }
    finally
    {
        // close statements here in individual try/catch blocks.
    }
}
1 голос
/ 11 мая 2011
  1. да
  2. да
  3. да, вы указываете Hibernate, где начинается / заканчивается транзакция, и она сообщает СУБД
  4. , что вы правы, Hibernate ненужно уметь реализовывать транзакции в СУБД
  5. да
  6. да
  7. да
  8. да
  9. да
  10. Да, Spring просто запускает его

По вашему вопросу, я думаю, вы уже прочитали транзакции в документах Spring Предлагаю вам также прочитать эту статью IBM developerWorks по транзакциям

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