Извините, я не могу воспроизвести это поведение. Как именно вы выполняете ваши SELECT ... FOR UPDATE
запросы в JDBC?
У меня есть таблица, 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.