【发布时间】:2020-08-31 07:33:42
【问题描述】:
我们正在从 MySQL 连接器迁移到 MariaDB 连接器。我们正在使用 Spring 和 Bitronix 事务管理器。
当我们更改连接器时,我们面临着一些交易问题。可能我们找到了根本原因:MySQL和Maria处理join事务的区别,详情请看下面:
我们在项目的几个地方使用了这个注解:
@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 会有所帮助,但我认为这对我们来说不是办法。
【问题讨论】:
-
正如您所指出的,这是驱动程序中的一个问题。错误报告完成:jira.mariadb.org/browse/CONJ-825
标签: java mysql mariadb spring-transactions connector