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.
我们正在从 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.