问题描述
我们正在从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.