Acceso múltiple a registros

Hola tengo un problema con mi aplicación (manejo de una base de datos a través de web). Estoy trabajando en postgresql y java necesito saber como puedo impedir acceder a un usuario con permiso escritura a un registro que lo tenga abierto otro usuario con permiso escritura.ME han dicho que se emplenta al abrir la base de datos por medio de locks o transacciones. PEro no tengo ni idea de esto. Podrías echarme una mano.TE pongo la clase echa en java para abrir la base de datos por si te sirve de ayuda:
void conectaDBMS(String basedato,String usuario) throws Exception {
if (Debug.LEVEL>0) Debug.println("BaseDatos.BaseDatos().basedato="+basedato);
if (Debug.LEVEL>0) Debug.println("BaseDatos.BaseDatos().usuario="+usuario);
con=null;
this.nombrebd = basedato;
this.usuario = usuario;
// url de la base de datos
String url=new String("jdbc:postgresql://"+
Configuracion.SGBD_IP+":"+Configuracion.SGBD_PORT+"/"+nombrebd);
// Carga del Driver
try {
Class.forName("org.postgresql.Driver");
} catch(ClassNotFoundException ex) {
if (Debug.LEVEL>1) Debug.println("Error al cargar el driver");
if (Debug.LEVEL>1) Debug.println(ex.getMessage());
}
// Establecimiento de la conexión
try {
con=DriverManager.getConnection(url,usuario,Configuracion.SGBD_PASS);
}catch (SQLException sqlEx) {
if (Debug.LEVEL>1) Debug.println("Se ha producido un error al establecer la conexión con: "+url);
if (Debug.LEVEL>1) Debug.println(sqlEx.getMessage());
throw new Exception("Error al establecer la conexion con el sistema DBMS");
}
}
Gracias de antemano.
Respuesta
1
Morente,
como bien te han dicho, lo puedes realizar de las dos formas que te han dicho, aunque podría decirse que una realiza lo que tú quieres pero no está realmente destinado a eso, las transacciones el único fin que tienen es el de realizar operaciones atómicas, que quiero decir con esto, que no pueden ser divididas, imaginas un ejemplo así..
inicio TRANS{
una_var=leer (tabla 1,col 1);
escribir(tabla 1, col 2=1);
estado=escribir(tabla 2,una_var*3);
if(estado)
COMMIT TRANS;
else
ROLLBACK;
}
Ahora te explico qué he querido explicar con eso, imagina que consultas de una lista de precios yasignas ana variable dicho valor, y luego ese valor multiplicado va a parar a otra tabla, imagina que en el medio te enteras que la tabla 2 que está en otro motor de DB está fuera de servicio y tu ya has cambiado el estado de la tabla 1 (columna 2) a 1 y resulta que no has podido realizar la operación, eso te llevaría a que tengas que deshacer tu operación anterior de escritura. Y con lo que respecta a la lectura, debes asegurarte que el valor utilizado en el momento de la lectura no puede ser accedido, el modo que maneja los bloqueos son internos al motor, hay muy poco DBMSs que te permitirían bloquear tablas directamente, pero desde luego que con transacciones puedes lograrlo bien, pero fíjate bien si es lo que quieres hacer una operación atómica, por eso es que te digo, que si bien puedes hacer lo que quieres con transaccines tal vez no es la mejor manera de hacerlo, ¿entiendes por dónde voy?.
En cuanto al bloqueo propiamente dicho es quien veo mejor relacionado con tu problema particular, es decir lo que tienes que lograr, es bloquear las tablas como tu dices para que no puedan ser accedidas mientras se están escribiendo, esto tiene aparejado un inconveniente, que si tu código por alguna razón falla por la mitad y lo llega a desbloquear la tabla quedará bloqueada la tabla por un buen tiempo, ¿entiendes?.
En cuanto a la sintaxis que me imagino que será lo que te interesa en este casoen particular, es así:
LOCK <nombre_tabla> IN <modos> MODE
donde los modos pueden ser:
ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE |
SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE
Que bueno, me imagino que ya sabes qué es lo que hacen. Así como cuál puedes utilizar, no intento ser pesado, pero verifica bien de qué índole es tu problema, ya que si es una simple escritura de una tabla, es decir UPDATE, INSERT, etc, el bloqueo lo realiza el mismo DBMS sin que tengas que hacer nada, pero si sonvarias operaciones tendrás que utilizar lo dicho.
Espero haber sido explícito, y si deseas alguna otra cosa, no dudes en consultarlo.
Chau

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas