PDA

Ver la Versión Completa : Problema Bloqueo de tabla


shoulder
02-05-2013, 20:57:26
Hola tengo un problema, quiero bloquear una tabla en modo lectura, para tomar el ultimo numero, sumarle 1 y grabar el siguiente numero, son partes medicos por empleado y vuelve a uno cuando cambia el año, pero no me funciona el "for update" no hace nada puedo seguir leyendo, no me bloquea para que otro no pueda leer. Version Mysql 5.5.28 Innodb

Ejemplo 1
set autocommit = 0;
select parte from ficha where anio = :anio order by parte desc limit 1 for update;
Insert into ficha (....)
commit;

El ejemplo 2, me bloquea la tabla y no me deja seguir (se me bloquea en el select),lo que quiero que ese usuario tome la tabla y los demas queden a la espera.

set autocommit = 0;
lock tables ficha read
select parte from ficha where anio = :anio order by parte desc limit 1 ;
Insert into ficha (....)
commit;


Gracias.

Casimiro Notevi
03-05-2013, 11:04:50
Ni idea de bloquear tablas en mysql, ni creo que sea necesario, pero a lo que voy, para obtener el mayor número no hace falta hacer eso, basta con algo así como:
select max(parte) from ficha where ...

shoulder
03-05-2013, 16:21:11
Hola Gracias primero por responder, me sucedio que dos usuarios consultaron en el mismo segundo y a los dos les dio el mismo numero, busque en internet y hay que bloquear las tablas por medio de START Transaction, pero no me funciona.

shoulder
03-05-2013, 16:57:05
ya lo arregle asi, en unit agregue ZDbcIntfs


form1.ZConnection1.TransactIsolationLevel := tiReadCommitted;
form1.ZConnection1.StartTransaction;

zquery2.add( Select....
zquery2.add(Insert..)
form1.ZConnection1.Commit;;


Starttransaction solo funcione en Innodb, y bloquea las tablas hasta encontrar el primer commit, con eso me amparo que no entre un usuario y tome el mismo numero. Nunca me habia sucedido hasta ayer cuando vi que dos personas tenian el mismo parte medico (no lo puedo prefijar por autoincrement porque al cambiar el año vuelve a 1 y los partes se renuevan con el mismo numero dentro de la misma enfermedad). Cuando me fije habian entrado dos secretarias a las 09:11:24 segundos....

marinaAv
13-05-2013, 18:53:09
hola bueno a mi me paso una ves eso y lo que hic fue que el proceso se hiciera dos veces sin guardar la primera solo para verificar que otra persona no hubiera tomado el mismo folio ( en mi caso eran facturas) y asi me funciono bien y ya no me paso de nuevo

shoulder
15-05-2013, 22:36:28
Por si alguien me puede ayudar en el Post mas arriba yo deje escrito como hice la transaccion, funcionaba barbaro, hoy a la mañana me quedo tomada o bloqueada la tabla principal, podian leer pero no se podia hacer ningun insert o update.

Baje el motor, hice de todo (unlock, etc) y nada, a la hora volvio a funcionar bien. Como se hace cuando hay un deadlock para destrabar la tabla?