Конфигурирование источника данных XA для базы данных mysql 8 с помощью Spring-Boot и JTA-менеджера bitronix завершается неудачно с SqlException XAERR_RMERR - PullRequest
1 голос
/ 01 июля 2019

Я создал проект Spring Boot 2 (2.1.6.RELEASE) с зависимостями от spring-boot-starter-data-jpa и spring-boot-starter-jta-bitronix с источником данных XA, настроенным для базы данных Mysql ( 8.0.16).

Файл свойств приложения (обрезанный по релевантности со значениями-заполнителями между <>) содержит следующую конфигурацию:

spring:
  datasource:
    url: jdbc:mysql://<host>:<port>/<dbName>
    username: <username>
    password: <password>
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    database-platform: org.hibernate.dialect.MySQL8Dialect
    hibernate:
      ddl-auto: none
  jta:
    bitronix:
      properties:
        server-id: <serverid>

При запуске приложения весенней загрузки я получил следующую трассировку стека:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unsatisfied dependency expressed through method 'entityManagerFactory' parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'entityManagerFactoryBuilder' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unsatisfied dependency expressed through method 'entityManagerFactoryBuilder' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaVendorAdapter' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.orm.jpa.JpaVendorAdapter]: Factory method 'jpaVendorAdapter' threw exception; nested exception is bitronix.tm.resource.ResourceConfigurationException: cannot create JDBC datasource named dataSource
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'entityManagerFactoryBuilder' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unsatisfied dependency expressed through method 'entityManagerFactoryBuilder' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaVendorAdapter' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.orm.jpa.JpaVendorAdapter]: Factory method 'jpaVendorAdapter' threw exception; nested exception is bitronix.tm.resource.ResourceConfigurationException: cannot create JDBC datasource named dataSource
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaVendorAdapter' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.orm.jpa.JpaVendorAdapter]: Factory method 'jpaVendorAdapter' threw exception; nested exception is bitronix.tm.resource.ResourceConfigurationException: cannot create JDBC datasource named dataSource
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.orm.jpa.JpaVendorAdapter]: Factory method 'jpaVendorAdapter' threw exception; nested exception is bitronix.tm.resource.ResourceConfigurationException: cannot create JDBC datasource named dataSource
Caused by: bitronix.tm.resource.ResourceConfigurationException: cannot create JDBC datasource named dataSource
Caused by: bitronix.tm.recovery.RecoveryException: failed recovering resource dataSource
Caused by: com.mysql.cj.jdbc.MysqlXAException: XAER_RMERR: Fatal error occurred in the transaction branch - check your data for consistency
Caused by: java.sql.SQLException: XAER_RMERR: Fatal error occurred in the transaction branch - check your data for consistency

1 Ответ

0 голосов
/ 01 июля 2019

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

От проверки средства отслеживания ошибок bitronix на github https://github.com/bitronix/btm/issues/100, было не очень понятно, какое было разрешение, хотя проблема уже была закрыта без прямого ответа.

Чтение часто задаваемых вопросов по битрониксам в https://github.com/bitronix/btm/wiki/FAQ подсказало проблему.хотя и относится к Oracle, который относится к отсутствующим пользовательским привилегиям.

Дальнейшие исследования привели к появлению страницы документации MySQL 8 по привилегиям https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html с особым акцентом на следующем разделе.

До MySQL 8.0 любой пользователь мог выполнить инструкцию XA RECOVER, чтобы обнаружить значения XID для ожидающих подготовленных транзакций XA, что может привести к фиксации или откату транзакции XA пользователем, отличным от того, кто ее запустил. В MySQL 8.0 XA RECOVER разрешен только пользователям, имеющим привилегию XA_RECOVER_ADMIN, которая, как ожидается, будет предоставляться только административным пользователям, которые в ней нуждаются. Это может иметь место, например, для администраторов.приложения XA, если оно аварийно завершилось, и необходимо найти незавершенные транзакции, запущенные приложением, чтобы их можно было откатить.Это требование привилегий не позволяет пользователям обнаруживать значения XID для ожидающих выполнения готовых транзакций XA, кроме их собственных.Это не влияет на нормальную фиксацию или откат транзакции XA, потому что пользователь, запустивший ее, знает ее XID.

Поэтому я добавил необходимую привилегию пользователю источника данных с помощью следующих команд в MySQL ( Замените соответствующим образом имя пользователя и раздел хоста ).

GRANT XA_RECOVER_ADMIN ON *.* TO 'username'@'%';
FLUSH PRIVILEGES;

С этим изменением приложение весенней загрузки запускается без проблем.

...