Mysql: esempio di select [...] for update

Qui si trova la documentazione ufficiale:

http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

Lo scenario è lo stesso descritto dalla pagina sopra: l’operazione da eseguire consiste nel leggere un campo da una tabella ed incrementarlo di una unità. Essendo due operazioni vanno eseguite premunendosi del fatto che nessun altro interroghi la tabella fino a quando non vengono terminate entrambe.

Per effettuare il lock è necessario essere sotto transazione, con autocommit disattivato. Qui trovate come effettuare transazioni in Java

http://java.sun.com/docs/books/tutorial/jdbc/basics/transactions.html

In sostanza si inizia una transazione impostando a false la proprietà autocommit e si termina con il commit o il rollback. E come ultima cosa si rimette l’autocommit a true:

import java.sql.*;
private Connection con;con.setAutoCommit(false);
con.commit(); / con.rollback();
con.setAutoCommit(true);

Ecco l’esempio del SELECT FOR UPDATE:

public static int getIDInvio(SMSConnect conMySql) {
 
   String tmp;
   ResultSet rs;
   int ris = 0;
 
   conMySql.beginTrans();
 
   tmp = "SELECT MAX(ID) FROM TBINVII FOR UPDATE";
   rs = conMySql.getResultset(tmp);
   if (!(rs==null)) {
      try {
      rs.next();
      ris = rs.getInt(1);
      ris++;
      }
      catch (Exception e) {//Errore...}
   }
   else {//Errore...}
 
   tmp = "UPDATE TBINVII SET ID = ID + 1";
   if (!conMySql.executeQuery(tmp)) {//Errore...}
   conMySql.commit();
   return ris;
}

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>