如何解决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.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。