programing

MariaDB 커넥터 vs MySQLDB 커넥터 - 트랜잭션 문제

lastmoon 2023. 7. 21. 21:53
반응형

MariaDB 커넥터 vs MySQLDB 커넥터 - 트랜잭션 문제

MySQL 커넥터에서 MariaDB 커넥터로 마이그레이션하고 있습니다.우리는 스프링과 비트로닉스 거래 매니저를 사용하고 있습니다.

우리가 커넥터를 변경했을 때, 우리는 거래와 관련된 몇 가지 문제에 직면해 있습니다.MySQL과 Maria와의 조인된 트랜잭션 처리 간의 차이라는 근본적인 원인을 발견했을 수 있습니다. 아래의 세부 정보를 참조하십시오.

이 주석은 프로젝트의 여러 위치에서 사용되고 있습니다.@Transactional(propagation = Propagation.REQUIRES_NEW)

구현의 차이점은 다음과 같습니다.

MySQL 커넥터, MysqlX연결 #이(가) 동일합니다.RM 구현:

if(xaresinstanceofMysqlXAConnection){
 return this.underlyingConnection.isSameResource(((MysqlXAConnection)xares).underlyingConnection);
}

MariaDB 커넥터, org.mariadb.jdbc.MariaXaResource#는 동일합니다.RM 구현:

//Typicallyusedbytransactionmanagerto"join"transactions.Wedonotsupportjoins,
//soalwaysreturnfalse;
return false;

같은 문제에 직면한 사람이 있습니까?어떻게 처리합니까?

구현:

/**
 * Implementation of Audit Log which saves data using JPA in new transaction.
 */
public class JpaAudit implements AuditSPI {

    @Autowired
    private AuditlogRepository auditLogRepository;

    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void log(AuditLogEntity aAuditObj) {
        auditLogRepository.save(aAuditObj);
    }
}

변화하는Propagation.REQUIRES_NEW로.Propagation.REQUIRED도움을 주지만 우리에게는 방법이 아닌 것 같습니다.

질문의 문제는 Diego Dupin(그 덕분에)에 의해 보고되고 수정되었습니다(CONJ-825).

커밋의 주요 부분은 src/main/java/org/mariadb/jdbc/MariaXaResource.java입니다.

 @Override
  public boolean isSameRM(XAResource xaResource) {
-    // Typically used by transaction manager to "join" transactions. We do not support joins,
-    // so always return false;
+    if (xaResource instanceof MariaXaResource) {
+      MariaXaResource other = (MariaXaResource) xaResource;
+      return connection
+          .getProtocol()
+          .getUrlParser()
+          .equals(other.connection.getProtocol().getUrlParser());
+    }
+    return false;
  }

이 수정 사항은 MariaDB Connector/J 2.7.0에 포함되어 있습니다.

언급URL : https://stackoverflow.com/questions/63666604/mariadb-connector-vs-mysqldb-connector-transaction-issue

반응형