Поддерживает ли транзакция в Spring Boot с JpaTransactionManager Isolation.SERIALIZABLE?

avatar
user14159813
9 августа 2021 в 01:34
150
0
0

После создания JpaTransactionManager в приложении Spring Boot (2.2.5.RELEASE) я вызываю операции репозитория, такие как save, findById и т. д., в рамках различных транзакций с использованием диспетчера транзакций.

Для выполнения save уровень изоляции транзакции устанавливается на SERIALIZABLE, тогда как для вызова findById уровень изоляции транзакции устанавливается на READ_UNCOMMITTED.

Уровень ведения журнала установлен на DEBUG (LOGGING_LEVEL_ORG_SPRINGFRAMEWORK=DEBUG).

В журнале я заметил, что уровень изоляции, отображаемый для save, является ISOLATION_DEFAUL, а не SERIALIZABLE, тогда как для find он правильно отображается как READ_UNCOMMITTED.<96056511144895>

[org.springframework.transaction.support.AbstractPlatformTransactionManager:getTransaction:370] — Создание новой транзакции с именем [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT

[org.springframework.transaction.support.AbstractPlatformTransactionManager:getTransaction:370] — Создание новой транзакции с именем [org.springframework.data.jpa.repository.support.SimpleJpaRepository.........]: PROPAGATION_REQUIRED ,ISOLATION_READ_UNCOMMITTED,только для чтения

Итак, вопрос в том, поддерживает ли транзакция в Spring Boot с JpaTransactionManager Isolation.SERIALIZABLE или нет? Здесь чего-то не хватает?

Код ниже:

1).

@Bean("entityManager")
public LocalContainerEntityManagerFactoryBean notificationEntityManager() {
    LocalContainerEntityManagerFactoryBean entityManager = new LocalContainerEntityManagerFactoryBean();
    entityManager.setDataSource(dataSource());
    entityManager.setPackagesToScan(new String[] {"com.......notification.entity", "com.......notification.repository"});
    HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    HashMap<String, Object> properties = new HashMap<>();
    entityManager.setJpaPropertyMap(properties);
    entityManager.setJpaVendorAdapter(vendorAdapter);
    return entityManager;
}

@Bean("transactionManager")
public PlatformTransactionManager notificationTransactionManager() {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(entityManager().getObject());
    return transactionManager;
}

2).

@Transactional(value = "transactionManager", isolation = 
Isolation.SERIALIZABLE, rollbackFor = Exception.class, timeout=1000)
private NotificationInfo save(NotificationInfo notificationInfo) {
    return notificationRepo.save(notificationInfo);
}

3).

@Transactional(value = "transactionManager", isolation = Isolation.READ_UNCOMMITTED, readOnly = true)
NotificationInfo findById(String notificationId) {
    return notificationRepo.findById(notificationId).get();
}

Источник

Ответы (0)