-
Notifications
You must be signed in to change notification settings - Fork 8.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
get table meta error #6685
Comments
你可以尝试1.8或者2.0吗?这两个版本上是被动刷新,不是主动刷新,而2.2开始会恢复主动和被动两种方式 |
|
ok,我们将在社区邮件或会议上对这个问题进行相关讨论 |
I will fix it! Tip: 由于表元数据缓存Key为单一表名,可能也存在跨库相同表名的情况下元数据获取错误的情况。 |
Ⅰ. Issue Description
seata 1.6.1(看了1.8和2.0的seata代码也有这个问题)
seata 自动刷新 TableMetaCache 时报错 “get table meta error”
Ⅱ. Describe what happened
jdbc:mysql://x.x.x.x:3306/A
数据库链接字串中配置的数据为A,此时有一个标注@GlobalTransaction的方法被调用,该方法操作了B数据库的table_1,即B.table_1,插入数据.
这时 io.seata.rm.datasource.sql.struct.cache.AbstractTableMetaCache#getTableMeta 虽然正常运行 ,等到当io.seata.rm.datasource.sql.struct.cache.AbstractTableMetaCache#refresh 刷新时 就会报错了。
“get table meta error”
最终排查因
直接原因:
1.4.2 代码是没有问题,是因为:client.rm.tableMetaCheckEnable 这个值默认为false,不会开启自动刷新cache
1.6.x client.rm.tableMetaCheckEnable(io.seata.rm.datasource.DataSourceProxy#ENABLE_TABLE_META_CHECKER_ENABLE) 默认值就变成了 true
根本原因:
io.seata.rm.datasource.sql.struct.cache.AbstractTableMetaCache#getTableMeta
public TableMeta getTableMeta(final Connection connection, final String tableName, String resourceId) {
if (StringUtils.isNullOrEmpty(tableName)) {
throw new IllegalArgumentException("TableMeta cannot be fetched without tableName");
}
**这里就取到了没有库前缀的tableName:table_1,在链接字符串 jdbc:mysql://x.x.x.x:3306/A 下访问 table_1 于是就报 A.table_1 不能存在 **
TableMeta tableMeta = fetchSchema(connection, entry.getValue().getTableName());
if (!tableMeta.equals(entry.getValue())) {
TABLE_META_CACHE.put(entry.getKey(), tableMeta);
LOGGER.info("table meta change was found, update table meta cache automatically.");
}
} catch (SQLException e) {
LOGGER.error("get table meta error:{}", e.getMessage(), e);
}
}
}
}
最后
可能seata没有考虑 在同一个程序中跨库访问,但是实际开发过程中由于各种原因会出现这种情况。
在seata团队没有修复之前,如果有这个不太要紧的错误,看着太烦可以设置client.rm.tableMetaCheckEnable = false。
希望可以帮助到一些人。
The text was updated successfully, but these errors were encountered: