springcloud分布式事務Atomikos實例


0.JTA(Java Transaction Manager)的介紹

(1)jta與jdbc

簡單的說 jta是多庫的事務 jdbc是單庫的事務

(2)XA與JTA

XA : XA是一個規范或是一個事務的協議.XA協議由Tuxedo首先提出的,並交給X/Open組織,作為資源管理器(數據庫)與事務管理器的接口標准.

XA規范定義了:
1. TransactionManager : 這個TransactionManager可以通過管理多個ResourceManager來管理多個Resouce,也就是管理多個數據源
2. XAResource : 針對數據資源封裝的一個接口
3. 兩段式提交 : 多數據源事務提交的機制

JTA(Java Transaction Manager) : 是Java規范,是XA在Java上的實現.
1. TransactionManager : 常用方法,可以開啟,回滾,獲取事務. begin(),rollback()...
2. XAResouce : 資源管理,通過Session來進行事務管理,commit(xid)...
3. XID : 每一個事務都分配一個特定的XID

JTA是如何實現多數據源的事務管理呢?

主要的原理是兩階段提交,以上面的請求業務為例,當整個業務完成了之后只是第一階段提交,在第二階段提交之前會檢查其他所有事務是否已經提交,如果前面出現了錯誤或是沒有提交,那么第二階段就不會提交,而是直接rollback操作,這樣所有的事務都會做Rollback操作.

(3)jta特點

JTA的有點就是能夠支持多數據庫事務同時事務管理,滿足分布式系統中的數據的一致性.但是也有對應的弊端:

  1. 兩階段提交
  2. 事務時間太長,鎖數據太長
  3. 低性能,低吞吐量

1.maven的pom中增加spring-boot-starter-jta-atomikos

2.配置jta和atomikos的多數據源,例如:

  jta:
    enabled: true
    atomikos:
      datasource:
        order:
          xa-properties.url: jdbc:h2:mem:dborder
          xa-properties.user: sa
          xa-properties.password:
          xa-data-source-class-name: org.h2.jdbcx.JdbcDataSource
          unique-resource-name: order
          max-pool-size: 10
          min-pool-size: 1
          max-lifetime: 10000
          borrow-connection-timeout: 10000
        log:
          xa-properties.url: jdbc:h2:mem:dblog
          xa-properties.user: sa
          xa-properties.password:
          xa-data-source-class-name: org.h2.jdbcx.JdbcDataSource
          unique-resource-name: log
          max-pool-size: 10
          min-pool-size: 1
          max-lifetime: 10000
          borrow-connection-timeout: 10000

3.atomikos的jta與jpa的配置和數據源配置

import org.hibernate.engine.transaction.jta.platform.internal.AbstractJtaPlatform;

import javax.transaction.TransactionManager;
import javax.transaction.UserTransaction;

/**
 * Created by caibosi on 2018-07-25.
 */
public class AtomikosJtaPlatform extends AbstractJtaPlatform {

    private static TransactionManager transactionManager;

    private static UserTransaction userTransaction;

    public static void setTransactionManager(TransactionManager transactionManager) {
        AtomikosJtaPlatform.transactionManager = transactionManager;
    }

    public static void setUserTransaction(UserTransaction userTransaction) {
        AtomikosJtaPlatform.userTransaction = userTransaction;
    }

    @Override
    protected TransactionManager locateTransactionManager() {
        return transactionManager;
    }

    @Override
    protected UserTransaction locateUserTransaction() {
        return userTransaction;
    }
}

4.使用jta 在方法上面使用@Transactional

    @Transactional
    public void newOrderRollback(String userId,String productCode,int quantity){
        UserOrder userOrder = new UserOrder();
        userOrder.setUserId(userId);
        userOrder.setProductCode(productCode);
        userOrder.setQuantity(quantity);
        userOrderDao.save(userOrder);

        EventLog eventLog = new EventLog();
        eventLog.setOperation("new order");
        eventLog.setOperator(userId);
        eventLogDao.save(eventLog);

        throw new RuntimeException("test jta rollback");
    }

 

5.在調用newOrderRollback時會回滾

參考:https://github.com/SpringCloud/spring-cloud-code.git ch24

  https://www.jianshu.com/p/3938e7172443


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM