Распределенные транзакции в нескольких источниках данных SpringBoot

Spring Boot
Хотя микросервисы становятся все более и более популярными, наша система также разделила множество модульных функций. Цель этого состоит в том, чтобы компенсировать недостатки монолитной архитектуры. При разделении микросервисов необходимо разработать подбазу данных и подтаблицу, но при этом должны быть разработаны распределенные транзакции. Наиболее типичным примером являетсяБанковский перевод, например, банк A переводит 500 юаней в банк B, процесс должен быть банком A-500, банком B+500, в этом процессеЛибо всем успехов, либо всем успехов. Во-первых, номера банка А и банка Б должны быть в разных базах.Если в процессе перевода, после банка А сначала -500 наличных, возникает проблема при банке Б+500, если транзакция не откатывается , то будет проблема с потерей 500 юаней, то есть будет проблемаТранзакционная согласованностьвопрос.


JTA + Atomikos для решения распределенных транзакций

1. ЮТА

JTA (Java Transaction API) — одна из 13 спецификаций разработки JavaEE. Java Transaction API, который позволяет приложениям выполнять распределенные транзакции — доступ и обновление данных на двух или более сетевых компьютерных ресурсах. Поддержка JTA драйвера JDBC значительно расширяет возможности доступа к данным. Самая простая и непосредственная цель транзакций — обеспечить достоверность и непротиворечивость данных.

2. Атомикос

Atomikos — это менеджер транзакций класса с открытым исходным кодом, который предоставляет дополнительные услуги для платформы Java.


Принцип работы: Распределенные транзакции включают диспетчеры транзакций и диспетчеры ресурсов с поддержкой XA. Менеджер ресурсов — это наша БД, а менеджер транзакций отвечает за регулирование и контроль всех транзакций, разработанных участвующей БД.

личное понимание: после того, как Atomikos получит соединение с базой данных, он заблокирует базовое управление транзакциями базы данных, а затем передаст его Atomikos для единого планирования и контроля.


Далее мы просто делаем распределенный контроль транзакций на основе SpringBoot.
1. Во-первых, нам нужно представить библиотеку maven, которую необходимо импортировать

<!--分布式事务-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>

2. Настройте источник данных


3. Класс конфигурации

Основная конфигурация

@Configuration
@MapperScan(basePackages = "com.example.mapper.db1", sqlSessionFactoryRef = "db1SqlSessionFactory")
public class DB1DataSourcesConfig {

    @Primary
    @Bean(name = "db1DataSource")
    public DataSource dataSource(DB1Config DB1Config) {

        // 设置数据库连接
        MysqlXADataSource mysqlXADataSource = new MysqlXADataSource();
        mysqlXADataSource.setUrl(DB1Config.getUrl_jdbc());
        mysqlXADataSource.setUser(DB1Config.getUsername());
        mysqlXADataSource.setPassword(DB1Config.getPassword());
        mysqlXADataSource.setPinGlobalTxToPhysicalConnection(true);

        // 交给事务管理器进行管理
        AtomikosDataSourceBean atomikosDataSourceBean = new AtomikosDataSourceBean();
        atomikosDataSourceBean.setXaDataSource(mysqlXADataSource);
        atomikosDataSourceBean.setUniqueResourceName("db1DataSource");
        return atomikosDataSourceBean;
    }

    @Primary
    @Bean(name = "db1SqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:/mapper/db1/*.xml"));

        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setMapUnderscoreToCamelCase(true);

        sessionFactoryBean.setConfiguration(configuration);
        return sessionFactoryBean.getObject();
    }

    @Primary
    @Bean(name = "db1SqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

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

4. Тест
Здесь разработана модификация двух данных, имени учащегося и оценки учащегося, эти два данных хранятся в разных базах данных соответственно. Сначала мы изменяем информацию о пользователе через интерфейс, а затем изменяем информацию о счете пользователя.

Нет данных до модификации

Давайте не будем сначала добавлять транзакции, а посмотрим, есть ли исключение при изменении оценки, и будет ли откатываться информация о пользователе.

результат

Во-первых, код сообщает об ошибке в строке 39. Если по нашей логике, если модификация балла не удалась, соответствующая модификация возраста пользователя также не удалась, но результат показывает, что возраст пользователя все еще модифицируется.Очевидно, этот интерфейс не был распределен управляемой транзакцией.


Сначала меняем данные обратно на исходные, а потом ставимбизнес плюс, кажется, что эта проблема не возникает. (метод плюс@TransactionalПросто аннотируйте)

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

Суммировать:Выше весь процесс JTA+Atomikos для реализации распределенных транзакций.Реализовать функции относительно просто.Вышеуказанные тесты основаны на одном проекте SpringBoot.По сравнению с реальными микросервисами я еще не делал этого.Для тестирования , если вам нужно управление транзакциями между микросервисами, вы также можете использовать mq или dubbo для управления согласованностью транзакций. Я поделюсь им с вами, когда буду исследовать его позже.

адрес гитхаба:https://github.com/liangbintao/distributed_transaction.git

Для большего количества контента, пожалуйста, обратите внимание на публичный аккаунт WeChat: рост программиста