Skip to content
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

批量执行Update返回值不准确 #180

Closed
hanahmily opened this issue Nov 18, 2016 · 11 comments
Closed

批量执行Update返回值不准确 #180

hanahmily opened this issue Nov 18, 2016 · 11 comments

Comments

@hanahmily
Copy link
Contributor

批量执行Update 返回执行条数不准确。返回数据的行数是真实的SQL执行,但按照JDBC的规范应该返回逻辑SQL的执行。目前在特定条件返回的数组会多。

@githublaohu
Copy link

这个我接了,能告诉我一个切入点吗?
然后这个问题是 因为分表问题造成的吗吗?

@githublaohu
Copy link

有没有重现代码?

@hanahmily
Copy link
Contributor Author

@githublaohu 这个主要是PreparedStatementExecutor.executeBatch的方法的返回值不准确。
主要原因是批量执行的时候是多个sql,比如:
order表的order_id单数路由到 order_1 双数路由到order_0
update ... from order where order in (?,?)

此时批量执行两次

  1. 1,2
  2. 4,6

测试返回值应该是[2,2] 但实际可能是[1,1,2]。因为sjdbc会把同一个表的批量执行放到一个preparedstatement中,所以[1,2] [4,6]是一个preparedstatement(order_0), [1,2]是另一个prepared statement(order_1)

@githublaohu
Copy link

好的,收到,我先把环境搭建好。 @hanahmily

@githublaohu
Copy link

我看了, PreparedStatementExecutor.executeBatch 到执行 sql语句,应该不是PreparedStatementExecutor.executeBatch的错,而是 路由生成sql的问题吧。

@githublaohu
Copy link

executeBatch 使用多线程执行,是不是会有问题,
如果 批处理 的语句有执行关系
比如 批处理 a是添加,b是查询。如果多线程执行,a添加比b查询执行慢,那不出现脏数据了?

@hanahmily
Copy link
Contributor Author

PreparedStatement的batch的语句是预编译的,所以不会查询a是查询,b是添加。batch操作针对的是一个语句的,但是参数不同。这个问题的点应该是没错的。您可以再仔细看看

@githublaohu
Copy link

看了,把 PreparedStatement 的 executeBatch 后面的所有都看完了。
update操作的数据,是100%能得到了,也找到的,获得异步返回的代码,
所以感觉是 路由方面的错误。
我找时间,搭建测试。

@hanahmily
Copy link
Contributor Author

好的,想好改造思路后,在这里回复一下,咱们讨论好方案再动手。谢谢

hanahmily pushed a commit that referenced this issue Jan 20, 2017
@githublaohu
Copy link

不好意思,终于忙过来了,
环境搭建好,已经在调试。问题感觉是定位到了。
这个星期应该可以出解决方案。

@githublaohu
Copy link

问题已经找到,是rote分sql。
PreparedStatement ps = conn.prepareStatement("update t_order set status = ? where order_id in (?,?,?,?)" ); ps.setString( 1 , "lao" ); ps.setInt( 2 , 1101 ); ps.setInt( 3 , 1102 ); ps.setInt( 4 , 1001 ); ps.setInt( 5 , 1003 );
应该是 分三条 sql 语句,然后分了四条出来了,有一条重复执行

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants