2011-08-02 55 views
0

我正在使用JDBC和内联SQL语句的传统JSP的Web应用程序。JDBC语句中的顺序

我们遇到了数据库中数据不正确的问题,我想知道是否有可能以与它们在代码中指定的顺序不同的顺序执行两条语句。即,如果我们有两个更新语句像以下示例一样运行。

String sql1 = "update table set x = y"; 
String sql2 = "update table set z = a"; 
Statement statement = conn.createStatement(); 
db_wrapper.runSQL(sql1,statement); 
db_wrapper.runSQL(sql2,statement); 

是否有可能在重负载下第二个sql语句将在数据库的第一个sql语句之前运行。

安装我们主要是在oracle数据库上运行的问题。

而且该代码当前不使用事务。

+1

使用交易 - 听起来像是一个简单的修复。毕竟,你已经有了'Connection'实例。即使你没有告诉我们的数据库(不是“甲骨文”等),驱动程序,JVM,哪个平台,您正在使用的servlet容器......哦,哪个版本,以及所使用的硬件和运行的进程的列表......不太可能有人猜测。 – Paul

+1

什么是db_wrapper?它是否同步提交请求?还是异步? –

+0

只是一个包含statement.executeUpdate等异常处理的包装。 – eaglestorm

回答

2

不,该线程将按照该顺序调用Oracle驱动程序,不存在方法调用的明确重新排序,也不会在JDBC中重新排序或查询。

但是:

  1. 你确定你的代码没有缓存调用数据库,并最终执行它以不同的顺序或将它发送到不同的连接?如果它将查询发送到不同的连接,则可能发生这样的情况:执行第二条语句的那些连接之一在第一条连接之前终止,并且第一条连接失败。
  2. 你检查你函数的返回值?或者例外?难道第一个查询只是由于任何原因而无法通过代码检查而失败?也许catch'd,记录某处模糊(像系统),从来没有认真对待?
  3. 驾驶员可奇怪的方式行事。虽然我不知道您正在使用的是哪个版本的Oracle,但JDBC驱动程序可以自由地执行他们想要的任务。
  4. 在重负载下,多个线程将执行JSP,因此除非代码正确同步或查询的范围适当,否则可能会发生许多奇怪的事情。
0

数据应按您提交更新执行的顺序显示。