Bonjour,
Après deux jours de recherches je viens vers en espérant trouver ma réponse
J'ai une application qui est utilisé en multi thread, et je veux qu'un thread puisse verrouiller une ligne (pour que les autres threads ne puisse rien faire sur cette ligne) pour là mettre à jour puis la débloquer après l'update.
Donc je voulais utiliser SELECT FOR UPDATE, mais j'ai l'impression que ca ne fonctionne pas, voilà mon code :
Donc, le premier appel doSelectTest() devrait faire le lock, mais le deuxième appel doSelectTest() devrait planter en faisant le lock, ce qui n'est pas le cas, result :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 public BasicJDBCDemo() { try { conn = ds.getConnection(); conn.setAutoCommit(false); doSelectTest(); doSelectTest(); conn.close(); } catch (SQLException ex) {System.err.println(ex.getMessage());} } private void doSelectTest() { System.out.println("[OUTPUT FROM SELECT]"); String query = "Select * from b2bicheckpoint where OID = ? FOR UPDATE"; PreparedStatement pst = null; ResultSet rs=null; try { pst = conn.prepareStatement(query); pst.setLong(1, 3001); rs = pst.executeQuery(); while (rs.next()) { String s = rs.getString("HostName"); long oid = rs.getLong("OID"); System.out.println("OID/Host=="+oid+"/"+s); } } catch (SQLException ex) { ex.printStackTrace(); } finally { DBUtil.close(pst); DBUtil.close(rs); } }
1) premier appel doSelectTest()
[OUTPUT FROM SELECT]
query==Select * from b2bicheckpoint where OID = ? FOR UPDATE
OID/Host==3001/UnknownHost
2) deuxiéme appel doSelectTest()
[OUTPUT FROM SELECT]
query==Select * from b2bicheckpoint where OID = ? FOR UPDATE
OID/Host==3001/UnknownHost
Partager