Oracle - Transacción sencilla

 
Vista:

Transacción sencilla

Publicado por Julián Cabria (2 intervenciones) el 30/08/2010 08:53:40
Hola chicos,

Resulta que estoy programando una aplicación en la qual tengo una tabla de oracle donde guardo información de contenedores. Cada registro es un contenedor. Diferentes usuarios pueden realizar operaciones sobre los contenedores. La aplicación, para que un usuario pueda realizar dichas operaciones, marcará un campo del registro para indicar que el contenedor está bloqueado y así ningún usuario pueda realizar operaciones mientras este las esté realizando.

Hasta aquí ningun problema, el dilema viene ahora:

Para marcar un contenedor como ocupado hay que hacer dos pasos:

1.- SELECT para consultar si el contenedor está ocupado
2.- Si el contenedor está libre, UPDATE para marcar el contenedor como ocupado

Si dos usuarios quieren ocupar el contenedor a la vez pasaria lo siguiente:

USUARIO 1 USUARIO 2

SELECT -Contenedor libre
SELECT -Contenedor libre
UPDATE -Ocupado por USU1
UPDATE -Ocupado por USU2

Los dos usuarios ocuparían el contenedor. Necesitaria que el SELECT y el UPDATE se ejecutaran consecutivamente, dentro de una misma transacción.

Soy nuevo en ORACLE. He estado mirando documentación y no hay la instrucción BEGIN TRANSACTION. Una transacción en ORACLE, si no me equivoco, se inicia en una sentencia LDD o LMD pero el SELECT no es ninguna de ellas. Como puedo solucionar el problema?????????

Espero que haya quedado claro el problema. Muchas gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Transacción sencilla

Publicado por Sergio (39 intervenciones) el 30/08/2010 17:05:17
Julián, el manejo de transacciones es de las funcionalidades más eficientes de Oracle en donde tú no tienes que preocuparte de absolutamente nada para lograrlo. Cuando ejecutas un UPDATE en automático se bloquean los registros que este abarca y nadie más los puede modificar solo hasta después de que ejecutas el COMMIT, es decir, a diferencia de otros manejadores de bases de datos como SQL Server o MySQL en donde no hay que ejecutar un COMMIT después de ejecutar el UPDATE, en Oracle la transaccionalidad se maneja de manera distinta, en este último tienes que forzosamente hacer un COMMT después de ejecutar cualquier instrucción UPDATE, en el inter de la ejecución del UPDATE y el COMMIT los registros son automáticamente bloqueados para que nadie más los pueda modificar o eliminar, sin embargo, los puedes consultar pero no verás los cambios recientes hasta después del COMMIT.

Si se puede hacer lo que mencionas, sin embargo, desde mi punto de vista solo te vas a meter en problemas tratando de administrar algo que Oracle hace por tí.

Te recomiendo la siguiente liga con conceptos básicos sobre el tema:

http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/transact.htm#i6564
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Transacción sencilla

Publicado por Julián Cabria (2 intervenciones) el 30/08/2010 21:27:19
Muchas gracias por tu respuesta Sergio, me ha sido de gran ayuda. El problema es que yo quiero bloquearlo cuando hago un select. He estado mirando documentación y he encontrado el SELECT FOR UPDATE.

Primero hacer un SELECT FOR UPDATE

Después el UPDATE

Y finalizamos con un COMMIT

Que te parece el SELECT FOR UPDATE? Qual és tu opinión?

Muchas gracias de antemano Sergio.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Transacción sencilla

Publicado por Sergio (39 intervenciones) el 30/08/2010 23:58:55
Si te es de utilidad esa funcionalidad, adelante. Es totalmente válido.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar