Транзакции

На разположение

4.1 Въведение в транзакциите в Hibernate

Към всичко по-горе бих искал да добавя информация за транзакциите. Както вече знаете, транзакцията е група от действия, които трябва да се извършват само всички заедно . Ако някое действие е неуспешно or е изпълнено с грешка, тогава всички други действия трябва да бъдат отменени.

Hibernate може да работи с два типа транзакции:

  • JDBC
  • JTA

JDBC транзакцията всъщност е транзакция на база данни. Обвързан е с работа с базата данни, с JDBC връзката. И се грижи действията при работа с базата данни да се изпълняват Howто трябва: or всичко, or нищо.

JTA - транзакцията е транзакция на ниво приложение. Не е обвързан с ниHowва база данни. Неговата задача е да осигури извършването на определени действия: or всичко, or нищо.

Например, можете да записвате данни в няколко различни бази данни в рамките на една JTA транзакция. След това, ако възникне грешка, JTA транзакцията ще трябва да върне промените във всички бази данни. Дори тези, които са изпълнени успешно по отношение на определена база данни.

4.2 Hibernate Transactions Interface

В библиотеката Hibernate една транзакция се представя от интерфейса Transaction, който може да има различни реализации. Например, когато работите с Spring, Spring предоставя свой собствен JTA транзакционен механизъм.

Методите на този интерфейс са:

# Метод Описание
1 започвам () Започва нова транзакция
2 ангажирам () Приключва транзакцията, натиска/задължава всички промени
3 връщане назад() Връща назад текущата транзакция
4 setTimeout(int секунди) Задава максималното време за изпълнение на транзакцията
5 isActive() Проверява дали транзакцията е активна or не
6 wasRolledBack() Проверява дали транзакцията е върната нормално
7 wasCommitted() Проверява дали транзакцията е извършена нормално
8 registerSynchronization() Регистрира обратно извикване за контрол на транзакцията

важно! Създаването на обект на транзакция и стартирането на транзакция са две различни неща. Тук можете да направите аналогия с класа Thread. Когато създавате обект Thread(), JVM все още не стартира нова нишка. За да го стартирате, трябва да извикате метода start() на обекта Thread. Същото е и с транзакцията - тя трябва да извика метода begin().

Пример за това How транзакциите обикновено се обработват в Hibernate:

Session session = sessionFactory.openSession();
Transaction transaction = session.getTransaction();
try {
    transaction.begin();
    Long count = session.createQuery("select count(*) from Employee", Long.class).uniqueResult();
    transaction.commit();
}
catch (Exception e) {
	if (transaction.getStatus() == ACTIVE || transaction.getStatus() == MARKED_ROLLBACK) {
    transaction.rollback();
    }
}
finally {
	session.close();
	sessionFactory.close();
}

Тук виждаме три неща:

Първо, цялата работа с базата данни е обвита в транзакция чрез извикване на методи begin()и commit()всички действия между извикванията на тези два метода трябва да бъдат извършени: or всички заедно, or нищо.

Второ, ако възникне няHowва грешка, ние се опитваме да върнем транзакцията назад - извикайте rollback(). Това означава, че TransactionManger трябва първо да запише всички действия, които са бor между begin()и commit(), и след това да върне всичко Howто е било, ако извикаме rollback().

И между другото, не е факт, че няма да има грешка при извикване на метода за връщане назад. Винаги стават грешки. Просто трябва да приемете този факт и да сте готови за него.

4.3 Мениджър на транзакции

От гледна точка на управление на транзакциите, Hibernate е просто лека обвивка на обекти за JDBC. Самата Hibernate няма функции за обработка на транзакции. Hibernate Transaction всъщност е обвивка за основната JDBC транзакция (or JTA обвивка на транзакция). JDBCTransaction е по подразбиране. Пример от file с настройки на Hiberante:

hibernate.transaction.factory_class  org.hibernate.transaction.JTATransactionFactory
hibernate.transaction.factory_class  org.hibernate.transaction.JDBCTransactionFactory

Нека да погледнем отново нашия code, използващ транзакции:

Session session = sessionFactory.openSession();
Transaction transaction = session.getTransaction();
transaction.begin();
//here is your code for working with the base
session.flush();
transaction.commit();
session.close();

Сега нека да разгледаме codeа на класа JDBCTransaction:

public class JDBCTransaction implements Transaction {

    public void begin() throws HibernateException {
    	...
    	if (toggleAutoCommit) jdbcContext.connection().setAutoCommit(false);
    	...
    }
}

Това е методът за стартиране на транзакция. След това погледнете метода на изпращане:

public void commit() throws HibernateException {
    ...
    jdbcContext.connection().commit();
    ...
    jdbcContext.connection().setAutoCommit( true );
    ...
}

Сега нека заместим този code в примерния code на Hibernate:

Хибернация Прост JDBC code

Session session = sessionFactory.openSession();
Transaction transaction = session.getTransaction();
transaction.begin();
//here is your code for working with the database
session.flush();
transaction.commit();
session.close();

Connection conn = jdbcContext.connection();
conn.setAutoCommit(false);
 
//here is your database code
conn.commit ()
conn.setAutoCommit(true);
conn.close();

Така че нативните транзакции на Hibernate са само нативни JDBC извиквания към базата данни. Нищо повече и нищо по-малко. Но JTA транзакциите са по-интересни. Но за това друг път.

Коментари
  • Популярен
  • Нов
  • Стар
Трябва да сте влезли, за да оставите коментар
Тази страница все още няма коментари