shardingJdbc 读写分离 主方法中 调用同一个 service 的两个方法 第一个方法 删除,第二个方法查询 为啥第一个走的 写库 第二个走的读库

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 版本的读写分离 就没法用

记错版本了,事务走主库这个 bug,是 5.0.0 修复的,所以同一个事务中的读写都会路由到主库执行。

不在一个事务下 可以吗

不在一个事务中不可以呢,除非手动指定走主库。

能按照线程来不,一个主线程方法 嵌套太多层 并不能保证都在一个事务下

按照线程来,可以用 HintManager。

那要侵入业务代码了 不太好

可以等 5.1.0,用 SQL HINT 方式,强制路由 :: ShardingSphere

使用读写分离+分库分表 的配置下 同一个事务下 不会完全走主库
使用
System.out.println(“事务:” + TransactionSynchronizationManager.getCurrentTransactionName());
打印,确认是在事务下执行

这个是对 SQL HINT 的测试结果?

分库分表是Hint 方式

ShardingJdbc 是如何判断在事务中的

@jingshanglu 尚哥帮忙看下事务的问题

京ICP备2021015875号