Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Commit or bloquear tablas en INSERTS y/o Updates

Estas en el tema de Commit or bloquear tablas en INSERTS y/o Updates en el foro de Mysql en Foros del Web. Hola a todos , Tengo una duda sobre el uso de lock y del commit. Tengo una duda sobre su uso del commit. El commit ...
  #1 (permalink)  
Antiguo 03/04/2006, 03:56
 
Fecha de Ingreso: agosto-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 0
Commit or bloquear tablas en INSERTS y/o Updates

Hola a todos , Tengo una duda sobre el uso de lock y del commit.

Tengo una duda sobre su uso del commit. El commit Funciona como una transaccion, si no puede realizar la tarea la vueve a intentar haciendo rollback, pero me gustaria saber si mientras realiza esto se bloquea la tabla para inserciones y actualizaciones.

Tengo el suigente problema

Quiero realizar inserciones y actualizaciones en una bbdd que sigue la siguiente lógica:

Mira si el nombre existe, si no existe lo inserta y recoge el indice y si existe lee el indice.

Seria interesante que cuando insertara o actualizara nadie mas pudiera insertar o actulizar la tabla, es decir que fueran operaciones blocantes
(De hecho estoy pensando si seria interesante bloquear la lectura tambien).

¿Que opinais, con el commit basta o he de bloquear las tablas?

¿Me podriais orientar sobre como realizar de la mejor forma posible el bloqueo?

¿Es rápida esta operación?

Lamento ser tan pesado pero llevo todo el fin de semana currando sin salir de la oficina y mi cerebro empieza a estar un poco frito


Muchas gracias por todo.

Hasta pronto!
  #2 (permalink)  
Antiguo 03/04/2006, 08:42
Avatar de pyanqn  
Fecha de Ingreso: noviembre-2005
Mensajes: 331
Antigüedad: 18 años, 5 meses
Puntos: 8
Cuando quieras actualizar una tupla de tu tabla y quieras que nadie mas pueda hacerlo debes bloquerla haciendo

SELECT * FROM ejemplo WHERE <algo que identifique univocamente la tupa/s> FOR UPDATE

Esto causara un bloque a nivel de tuplas o rows, las que determine tu sentencia WHERE. y no seran liberados hasta que hagas un commit o rollback
  #3 (permalink)  
Antiguo 03/04/2006, 10:56
Avatar de pyanqn  
Fecha de Ingreso: noviembre-2005
Mensajes: 331
Antigüedad: 18 años, 5 meses
Puntos: 8
bien, lo ideal seria que otro usuario pudiera elejir si seguir esperando por el registro que le interesa o no. Es decir no se quiere que el usuario quede bloqueado hasta que el registro se libere. Hay alguna forma de detectar que el registro en cuestion esta bloqueado?

Si detecto que este esta en modo de solo lectura, o que esta bloqueado puedo alertar el usuario...

Sugerencias????
  #4 (permalink)  
Antiguo 04/04/2006, 06:26
 
Fecha de Ingreso: agosto-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 0
Lo que seria mas interesante es impedir la lectura de la tabla entera pq es posible que el registro que esté buscando lo esté insertando en ese momento, por eso me interesaba saber si la insercion o actulización con el commit es blocante, ya que si no encuentra el registro que busca lo inserta.

Con el commit ya conseguiria esto o es necesario cerrar la tabla, por cierto las tablas con la que trabajo son de tipo MyIsam esto podria ocasionar problemas, lo comento pq he leído que no son son transaccionales.

Quiza me estoy complicando mucho pero esto es un infierno.

Por cierto muchas gracias por los comentarios
  #5 (permalink)  
Antiguo 04/04/2006, 08:02
Avatar de deadlykyo  
Fecha de Ingreso: noviembre-2005
Ubicación: Cbba - Bolivia
Mensajes: 747
Antigüedad: 18 años, 5 meses
Puntos: 5
Holas OrionKing, Poniendo el Autocommit en 0 y haciendo tu manualmente los commits no impides la lectura o escritura de la tabla, es necesario el uso de LOCK TABLES para eso, aparte que si usas lock tables tendras un mejor tiempo de respuesta en tus consultas, ahora si quieres usar tablas transaccionales necesariamente tienen que ser de tipo InnoDB ya que MyIsam no soporta transacciones, suerte
__________________
"El Conocimiento es de todos, no solo de algunos"
  #6 (permalink)  
Antiguo 04/04/2006, 09:11
 
Fecha de Ingreso: agosto-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 0
Muchisimas gracias deadlykyo, ya me temia que la cosa iva a ir un poco chunga, no me queda mas remedio que utilizar MyIsam pq la herramienta con que la que trabajan en el despacho son de ese tipo.

De todas formas supongo que podré realizar los commit y los rollbacks y bloquaré las tablas para no tener problemas.

Muchas gracias de verdad.
  #7 (permalink)  
Antiguo 05/04/2006, 05:20
 
Fecha de Ingreso: agosto-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 0
Muchas gracias a todos por la ayuda , me parece que ya lo he conseguido, he realizado el siguiente código en java

He creado las funciones de insercion en la BBDD, cada vez que alguien inserta en la BBDD pasa por llamar a esa clase. La clase inserta en la base de datos y retorna el último id sertado, como vereis tambies se inserta el ultimo id en un campo de la tabla... la herramienta de trabajo funciona asi...

Una cosilla, ¿se pueden ralizar de forma eficiente los bloqueos de esa manera?
Al principio y en el finally

Por cierto los bloqueos tipo write bloquena solo escrituras o tambien lecturas?

Muchas gracias, ir aprendiendo cosillas en este foro es lo único bueno del día.

Hasta prontro.

Espero que el codigo en java en caso de que sea correcto le sirva de ayuda a alguien... es la fiesta de los try..

Código PHP:
  
        
try{
            Class.
forName("com.mysql.jdbc.Driver");
            
conn DriverManager.getConnection(urluserpass);
            
conn.setAutoCommit(false);
            
            try{
                
                
PreparedStatement pstm conn.prepareStatement(Sentencia);
                if (
prepare!=null){
                    for(
int pre=1;pre<prepare.length;pre++){
                        
pstm.setString(preprepare[pre]);
                    }
                }
                
pstm.execute();
                
conn.commit();
                
pstm.close();

               
// if(!incremento.equals("none")){
                    
PreparedStatement SlastID conn.prepareStatement("SELECT LAST_INSERT_ID() AS LASTID");
                    
ResultSet lastID SlastID.executeQuery();
                    
conn.commit();
                    while (
lastID.next()){
                        
questionID lastID.getLong("LASTID");
                    }
                     if(!
incremento.equals("none")){
                    
Updat="UPDATE "+tabla+" set "+incremento+" =_idregistro where _idregistro="questionID+" and "+incremento+" = 0";
                    
PreparedStatement Upd conn.prepareStatement(Updat);
                    
resUpdateUpd.executeUpdate();
                    
conn.commit();
                    
                    
//SlastID.close();
                    //lastID.close();
                    
Upd.close();
                }
               
//pstm.close();
                
                    
SlastID.close();
                    
lastID.close();
                    
conn.close();
                
                
                
            }catch (
SQLException ex) {
                
conn.rollback();
                
System.out.println("ERROR en consulta SQL.");
                
System.out.println("SQLException: " ex.getMessage());
                
System.out.println("SQLState: " ex.getSQLState());
                
System.out.println("VendorError: " ex.getErrorCode());
                
            }
finally{
                try{
                    
conn.setAutoCommit(true);
                    
// conn.close();
                
} catch (SQLException y) {  System.out.println("ERROR en consulta SQL.");
                
System.out.println("SQLException: " y.getMessage());
                
System.out.println("SQLState: " y.getSQLState());
                
System.out.println("VendorError: " y.getErrorCode());
                }
            }  
//finally
        
} catch(SQLException u){
            
System.out.println("ERROR en consulta conexxion.");
            
System.out.println("SQLException: " u.getMessage());
            
System.out.println("SQLState: " u.getSQLState());
            
System.out.println("VendorError: " u.getErrorCode());
            
        }catch (
ClassNotFoundException e){
            
//Mostra errors de creació del driver
            
System.out.println("No s'ha pogut conectar amb el servidor! :(");
            
        }
        return 
questionID
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:46.