[seata]AT模式下,在特定情况下MySql批量更新操作无法创建undolog

2024-07-05 426 views
0
一、问题描述

针对mysql数据库执行批量更新操作(PreparedStatement.executeBatch()方法),在满足mysql的批量更新操作条件(mysql配置rewriteBatchedStatements=true且批量更新记录数值>3)时,无法创建undolog,

Ⅱ. 描述发生的事情

经调试发现问题出在AbstractDMLBaseExecutor类中的以下方法中: protected T executeAutoCommitFalse(Object[] args) throws Exception { if (!JdbcConstants.MYSQL.equalsIgnoreCase(getDbType()) && isMultiPk()) { throw new NotSupportYetException("多pk仅支持mysql!“); } TableRecords 之前图像 = 之前图像(); T 结果 = statementCallback.execute(statementProxy.getTargetStatement(),args); int 更新计数 = statementProxy.getUpdateCount();如果 (updateCount > 0) { TableRecords afterImage = afterImage(beforeImage);准备UndoLog(图像前,图像后); } 返回结果; }

int 更新计数 = statementProxy.getUpdateCount();该行代码在mysql开启批量处理时始终返回-1(批量处理时没有对结果进行赋值),因此无法创建undolog 在关闭批量处理(rewriteBatchedStatements=false)或者批量处理数目<=3时正常

Ⅲ. 描述你期望发生的事情 Ⅳ. 如何重现它(尽可能简洁和精确)

1.mysql配置rewriteBatchedStatements=true 2.执行jdbcTemplate.batchUpdate.batchUpdate("update XXX set field=? where id=?”,args) 其中确保args的数量>3

Ⅵ. 环境:
  • JDK版本:1.8
  • Seata 版本:1.5.2
  • 操作系統:
  • 其他的:

回答

4

@walsece mysql 驱动程序版本是多少?你还有其他方法可以解决这个问题吗?

7
4838
9

mysql-connector-java 版本:8.0.17

7

@walsece 请帮忙验证#4898 是否已修复此问题。

9

也出现了这个问题,使用MyBatisPlus的saveBatch方法批量添加导致无法回滚,请问是怎么解决的