Главная

Java

Spring


@Transactional

import org.springframework.transaction.annotation.Transactional;
Транзакциями могут называтся действия которые полностью соответствуют ACID !!!
Если один из пунктов ACID не выполняется , то оно не может называться Транзакцией !! (например в MongoDB не выполняется Durability )

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

При использовании аннотации @Transactional в Spring следует добавить следующую строку в конфигурационный файл Spring:
<tx:annotation-driven transaction-manager="transactionManager"/>

Устанавливайте аннотацию @Transactional в слое сервиса (Service layer), а не в слое DAO !!!

По умолчанию @Transactional без параметров , является REQUIRED, значением атрибута "readOnly" – false, уровень изоляции соответствует уровню изоляции по умолчанию для базы данных (как правило, это READ_COMMITTED), и транзакция НЕ БУДЕТ откатываться в случае контролируемых исключений (checked exception) !!!

Странной особенностью флага "@Transactional(readOnly = true)" является то, что он вступает в силу только с началом новой транзакции ! В ORM окружении необходимо использовать этот флаг вместе с Propagation.SUPPORTS.

Не используйте аннотацию @Transactional на приватных, protected или default методах. Добавление аннотации к методами с private, protected или default модификаторами доступа не выбросит исключение.Однако аннотация будет проигнорирована !!!

лучше вообще не использовать аннотацию @Transactional при чтении данных из базы

Транзакциями в Spring управляют с помощью Declarative Transaction Management (программное управление). Используется аннотация @Transactional для описания необходимости управления транзакцией. В файле конфигурации нужно добавить настройку transactionManager для DataSource.

Распространение транзакций :

откат транзакций:

уровни изоляции транзакций:

Для уровня изоляции Read committed допустимы следующие особые условия чтения данных::




Через аннотации :

аннотировать ваши классы @Transactional аннотацией, добавить @EnableTransactionManagement к @Configuration классу

Если работать через JPA , то надо создавать TransactionManager + JpaTransactionManager бины

@Configuration
@EnableTransactionManagement
public class PersistenceJPAConfig{
 
   @Bean
   public LocalContainerEntityManagerFactoryBean
     entityManagerFactoryBean(){
      //...
   }
 
   @Bean
   public PlatformTransactionManager transactionManager(){
      JpaTransactionManager transactionManager
        = new JpaTransactionManager();
      transactionManager.setEntityManagerFactory(
        entityManagerFactoryBean().getObject() );
      return transactionManager;
   }
}

 -------------------------------------------------------------------------------------

@Service
@Transactional
public class FooService {
    //...
}


Через XML :


	<!-- Enable Annotation based Declarative Transaction Management -->
	<tx:annotation-driven proxy-target-class="true"
		transaction-manager="transactionManager" />

	<!-- Creating TransactionManager Bean, since JDBC we are creating of type 
		DataSourceTransactionManager -->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>

Или через JpaTransactionManager:

    <!-- Configure the transaction manager bean -->
    <bean id="transactionManager"
          class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>




транзакции соответствуют свойствам ACID :

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

Полезные ссылки: