MariaDB 连接器与 MySQLdb 连接器 - 事务问题

MariaDB connector vs MySQLdb connector - transaction issue

我们正在从 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) and corrected (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.