shardingJdbc 读写分离 主方法中 调用同一个 service 的两个方法 第一个方法 删除,第二个方法查询 为啥第一个走的 写库 第二个走的读库
哈喽,这个问题是一个 bug,在这个 PR 中修复了,可以看下:Keep data consistent in same transaction for readwrite-splitting only by terrymanu · Pull Request #13375 · apache/shardingsphere · GitHub
保证在同一个事物下可以 保证走写库吗
使用 master 分支可以,欢迎验证下。最近 5.1.0 版本也即将发布。
那当前版本 一个主线程方法内 包含 读 写 方法 什么情况下 可以正确的 都走写库
当前版本是指 5.0.0?可以使用 HintManager 强制路由主库。
String sql = "SELECT * FROM t_order";
try (HintManager hintManager = HintManager.getInstance();
Connection conn = dataSource.getConnection();
PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
hintManager.setWriteRouteOnly();
try (ResultSet rs = preparedStatement.executeQuery()) {
while (rs.next()) {
// ...
}
}
}
5.0.0 版本 主线程内 读、写方法 无论是否在同一个事务内都是 读走 读库 写走 写库吗,我看官方文档是
事务中的数据读写均用主库;
支持项
- 提供一主多从的读写分离配置,可独立使用,也可配合数据分片使用;
- 事务中的数据读写均用主库;
- 基于 Hint 的强制主库路由。
这样说的话 5.0.0 版本的读写分离 就没法用
不在一个事务下 可以吗
不在一个事务中不可以呢,除非手动指定走主库。
能按照线程来不,一个主线程方法 嵌套太多层 并不能保证都在一个事务下
按照线程来,可以用 HintManager。
那要侵入业务代码了 不太好
使用读写分离+分库分表 的配置下 同一个事务下 不会完全走主库
使用
System.out.println(“事务:” + TransactionSynchronizationManager.getCurrentTransactionName());
打印,确认是在事务下执行
这个是对 SQL HINT 的测试结果?
分库分表是Hint 方式
ShardingJdbc 是如何判断在事务中的