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