JDBC-Sperren eine Zeile mit SELECT FOR UPDATE, funktioniert nicht

Ich habe Probleme mit MySQL SELECT .. FOR UPDATE, hier ist die Abfrage, die ich versuche zu laufen:

SELECT * FROM tableName WHERE HostName='UnknownHost' 
        ORDER BY UpdateTimestamp asc limit 1 FOR UPDATE

Danach den betreffenden thread ein UPDATE und ändern Sie den Hostnamen, die ist dann sollte es entsperren der Zeile ein.

Ich bin mit einer multi-threaded java-Anwendung, also 3 threads ausgeführt werden diese SQL-Anweisung, aber wenn thread 1 ausgeführt wird, es nicht sperren Ihre Ergebnisse von thread 2 & 3. Daher werden threads, die 2 & 3 sind immer die gleichen Ergebnisse, und Sie könnten zum aktualisieren der gleichen Zeilen.

Auch jeder thread auf seine eigenen mysql-Verbindung.

Ich verwende Innodb, mit transaction-isolation = READ-COMMITTED, und das Autocommit ausgeschaltet ist, bevor die Ausführung des select for update

kann ich da etwas verpasst? ODER gibt es vielleicht eine bessere Lösung?
Vielen Dank.

Code :

public BasicJDBCDemo()
{
    Le_Thread newThread1=new Le_Thread();
    Le_Thread newThread2=new Le_Thread();
    newThread1.start();
    newThread2.start();         
}

Thread :

class Le_Thread extends Thread  
{

    public void run() 
    {
    tring name = Thread.currentThread().getName();
        System.out.println( name+": Debut.");
    long oid=Util.doSelectLockTest(name);
    Util.doUpdateTest(oid,name);        
    }

}

Wählen Sie :

public  static long doSelectLockTest(String threadName)
  {
    System.out.println("[OUTPUT FROM SELECT Lock ]...threadName="+threadName);
    PreparedStatement pst = null;
    ResultSet rs=null;
    Connection conn=null;
    long oid=0;
    try
    {
     String query = "SELECT * FROM table WHERE Host=? 
                               ORDER BY Timestamp asc limit 1 FOR UPDATE";


      conn=getNewConnection();
      pst = conn.prepareStatement(query);
      pst.setString(1, DbProperties.UnknownHost);
      System.out.println("pst="+threadName+"__"+pst);
      rs = pst.executeQuery();

      if (rs.first())
      {
        String s = rs.getString("HostName");
        oid = rs.getLong("OID");
        System.out.println("oid_oldest/host/threadName=="+oid+"/"+s+"/"+threadName);

      }   

    }
    catch (SQLException ex)
    {
      ex.printStackTrace();
    }
    finally
    {
        DBUtil.close(pst);
        DBUtil.close(rs);
        DBUtil.close(conn);
    }
    return oid;
  }

Bitte helfen.... :

Ergebnis :

Thread-1: Debüt. 
Thread-2: Debüt. 
[OUTPUT AUS WÄHLEN Sie Lock ]...threadName=Thread-1 
Neue Verbindung.. 
[OUTPUT AUS WÄHLEN Sie Lock ]...threadName=Faden-2 
Neue Verbindung.. 
pst=Thread-2: SELECT * FROM b2biCheckPoint WHERE HostName='UnknownHost' ORDER BY UpdateTimestamp asc limit 1 FOR UPDATE 
pst=Thread-1: SELECT * FROM b2biCheckPoint WHERE HostName='UnknownHost' ORDER BY UpdateTimestamp asc limit 1 FOR UPDATE 
oid_oldest/host/threadName==1/UnknownHost/Thread-2 
oid_oldest/host/threadName==1/UnknownHost/Thread-1 
[UPDATE durchführen] ... oid = 1, thread=Faden-2 
Neue Verbindung.. 
[UPDATE durchführen] ... oid = 1, thread=Faden-1 
pst_threadname=Thread-2: UPDATE b2bicheckpoint SET HostName='1_host_Thread-2',UpdateTimestamp=1294940161838 where OID = 1 
Neue Verbindung.. 
pst_threadname=Thread-1: UPDATE b2bicheckpoint SET HostName='1_host_Thread-1',UpdateTimestamp=1294940161853 where OID = 1 
Wie sind Sie mit der Erreichung dieser code her?
Was meinst du damit ?

InformationsquelleAutor Rachid | 2011-01-13

Schreibe einen Kommentar