我们正在从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是有帮助的,但我认为这对我们来说不是一条路。
发布于 2020-09-27 08:06:03
你问题中的问题由迭戈·杜宾( Dupin )报告(CONJ-825)并纠正(提交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连接器/J 2.7.0。中。
https://stackoverflow.com/questions/63666604
复制相似问题