Visual Basic Foro
Programación => Bases de Datos => Mensaje iniciado por: YAcosta en Septiembre 10, 2010, 12:45:31 am
-
Aqui una duda, estoy un poco confundido y quiza me puedan ayudar.
Entiendo que cuando en mi aplicación tengo:
db.BeginTrans
Inserto en tabla A
Inserto en tabla B
Actualizo tabla C
Inserto en tabla D
Actualizo en tabla E
db.CommitTrans
Lo que sucederá es que hasta que no llegue a la linea: db.CommitTrans los registros no se grabaran o actualizaran. Esto es bueno porque por si alguna razón se cae el servidor y justo nos quedamos en "Actualizo C" pues la misma BD hará un RoolBack y listo no dañe nada y se revertirá lo que hice en las tablas A, B y C.
Esto también entiendo nos sirve si llega en ese instante desde otro terminal esta petición queda en espera hasta que termine la primera, pero aquí mi duda:
¿Como sabe la otra petición que tablas no podrá tocar porque están como bloqueadas?
Es decir como este código esta en la aplicación y la aplicación envía la orden linea por linea a la BD.
Me explico
Pc1:
db.BeginTrans 'la BD sabe que no confirmara la grabación hasta que le llegue el Commit. de esta orden
Inserto en tabla A 'Escribe el registro sin confirmar.
Inserto en tabla B 'Escribe el registro sin confirmar.
Hasta este punto la BD no se entera que vamos a tocar las tablas C y D. y en ese microsegundo desde otro terminal:
Pc2:
db.Begintrans 'la BD sabe que no confirmara la grabación hasta que le llegue el Commit. de esta orden
Actualizo en la tabla E 'Modifica el registro sin confirmar.
db.CommitTrans 'Confirma la actualización del Registro en la tabla E.
Vuelvo a la Pc1 quien aun no tiene su Commit:
Actualizo tabla C 'Modifica el registro sin confirmar.
Inserto en tabla D 'Escribe el registro sin confirmar.
Actualizo en tabla E 'BRRRR <--- esta tabla ya la adultere, pueda que el registro actualice erróneamente porque fue tocado.
¿Esto es asi? Creo que no pasaría esto si bloqueo Toda la BD, pero entiendo que los motores bloquean por tabla e incluso por registro.
Tampoco podría ser que la BD sabe que tiene que bloquear las tablas A,B,C,D y E porque la orden va llegando de una en una.
Ojala me puedan echar una mano que estoy un poco perdido en este punto.
Gracias
-
A ver si me hago entender...!
Fijate, primero que nada el tiempo que toma ejecutar una accion entre el usuario de la PC1 y el usuario de la PC2 es variable, aun tratando de ejecutar esas acciones al mismo tiempo la respuesta de la máquina podria variar y por tal motivo para que arroje el error en la PC1 esta dificil...! Por que?
Al momento de que la PC1 esta ejecutando ciertas acciones, la PC2 ejecuta solo una y luego desbloquea la tabla, permitiendo asi que la PC1 cuando va a actualizar la tabla E lo haga sin problemas... Los errores podrian ejecutarse si al momento de estar corriendo un insert muy largo o un update muy largo en la PC1, la PC2 intenta ejecutar alguna modificacion en dicha tabla, alli si mostraria el mensaje y ello debes manejarlo indicando al usuario con un mensaje que no es posible actualizar.
Cualquier duda, estamos a la Orden...!
-
Ok entonces lo que me dices es que debo tener ubicado esa exepcion (ya que no creo que sea un error), capturala y dar un mensaje humano al usuario.
Esto por si ese usuario se saca el premio mayor y justo le dio al momento que la tabla se estaba alterando.
-
Actualizo en tabla E 'BRRRR <--- esta tabla ya la adultere, pueda que el registro actualice erróneamente porque fue tocado.
No tendria por que salir ningun error simplemente actualizaria y prevalece la ultima actualizacion que se hizo.
Logicamente si el usuario de la PC2 revisa el registro que modifico hace unos segundos veria que sus cambios fueron modificados desde x terminal en este caso PC1, podrias probar restando valores si el campo=10 y en PC2 le quita 1 quedaria 9 y en PC1 tambien quita 1 deberia quedar 8 y no salir ningun error.
Se me ocurre que pruebes con un timer y ejecutes ambas consultas en el mismo segundo y ver si hay conflicto, espero comentes como te fue.