我编写了一个简单的Java程序,它打开一个事务,选择一些记录,做一些逻辑,然后更新它们。我希望锁定记录,所以我使用SELECT ... FOR UPDATE。
该程序与MS SQL Server 2005完美配合,但在Oracle 10g中,记录未锁定!
知道为什么吗?
我按如下方式创建连接:
Connection connection = DriverManager.getConnection(URL, User, Password);
connection.setAutoCommit(false);
如果我从Oracle SQL Developer客户端执行SELECT..FOR UPDATE,我可以看到记录被锁定,所以我认为它可能是JDBC驱动程序的问题,而不是数据库问题,但我无法'在网上找到任何有用的东西。
这些是我正在使用的JDBC驱动程序的详细信息:
Manifest-Version: 1.0
Implementation-Vendor: Oracle Corporation
Implementation-Title: ojdbc14.jar
Implementation-Version: Oracle JDBC Driver version - "10.2.0.2.0"
Implementation-Time: Tue Jan 24 08:55:21 2006
Specification-Vendor: Oracle Corporation
Sealed: true
Created-By: 1.4.2_08 (Sun Microsystems Inc.)
Specification-Title: Oracle JDBC driver classes for use with JDK14
Specification-Version: Oracle JDBC Driver version - "10.2.0.2.0"
答案 0 :(得分:3)
抱歉,我无法重现此行为。究竟如何在JDBC中运行SELECT ... FOR UPDATE
查询?
我有一张表locktest
,其中包含以下数据:
SQL> select * from locktest; A B ---------- ---------- 1 0 2 0 3 0 4 0 5 0
我也有这个Java类:
import oracle.jdbc.OracleDriver;
import java.sql.*;
public class LockTest {
public static void main(String[] args) throws Exception {
DriverManager.registerDriver(new OracleDriver());
Connection c = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:XE", "user", "password");
c.setAutoCommit(false);
Statement stmt = c.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rSet = stmt.executeQuery(
"SELECT a, b FROM locktest FOR UPDATE");
while (rSet.next()) {
if (rSet.getInt(1) <= 3) {
rSet.updateInt(2, 1);
}
}
System.out.println("Sleeping...");
Thread.sleep(Long.MAX_VALUE);
}
}
当我运行这个Java类时,它会对表进行一些更新,然后开始休眠。它会休眠,以便保持事务处于打开状态,从而保留锁定。
C:\Users\Luke\stuff>java LockTest Sleeping...
当它处于休眠状态时,我尝试同时更新SQL * Plus中的表:
SQL> update locktest set b = 1 where a <= 3;
此时,SQL * Plus会挂起,直到我终止Java程序。