MariaDB连接器与MySQLdb连接器-交易问题

问题描述

我们正在从MysqL连接器迁移到MariaDB连接器。我们正在使用Spring和Bitronix事务管理器。

当我们更改连接器时,我们面临着一些交易问题。可能是我们找到了根本原因:使用MysqL和Maria处理合并事务之间的差异,请参见以下详细信息:

我们正在项目中的多个地方使用此注释: @Transactional(propagation = Propagation.REQUIRES_NEW)

以下是实现上的差异:

MysqL连接器,MysqLXAConnection#isSameRM实现:

if(xaresinstanceofMysqLXAConnection){
 return this.underlyingConnection.isSameResource(((MysqLXAConnection)xares).underlyingConnection);
}

MariaDB连接器,org.mariadb.jdbc.MariaXaResource#isSameRM实现:

//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),并改正(commit 70c406b2)(感谢他)。

提交的主要部分在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.