usuario update tipos tables pesimista optimista modos lock for ejemplo bloqueos bloqueo bloquear mysql locking myisam

mysql - tipos - select for update oracle bloqueo



Cómo bloquear una sola fila (5)

Como solución alternativa, puede agregar una columna a su tabla, como locked TINYINT(1) : siempre que desee bloquear la fila, debe establecerla en 1 . Cuando intenta acceder a esta fila, lo primero que debe hacer es verificar si los campos locked están configurados.

Para desbloquear la fila, simplemente ajústelo a 0 otra vez. No es agradable, pero una solución muy simple.

Tengo una tabla de user con el campo lastusedecnumber .

Necesito acceder e incrementar el lastusedecnumber .

Durante ese tiempo de acceso, necesito bloquear esa fila de usuario en particular (no toda la tabla).

¿Cómo hago esto?

El tipo de tabla es MyISAM .


MySQL usa solo el bloqueo a nivel de tabla de las tablas MyISAM. Si puede, cambie a InnoDB para el bloqueo a nivel de fila.

Aquí hay un enlace al sitio MySQL que describe los bloqueos establecidos por las declaraciones SQL para las tablas InnoDB. http://dev.mysql.com/doc/refman/5.0/en/innodb-locks-set.html


No tenía ganas de convertir toda mi base de datos de myisam. Así que simplemente trato de crear una nueva tabla con el nombre del ID del registro que quiero bloquear. Si crear tabla tiene éxito, haga mi trabajo y elimine la tabla al final. Si la tabla de creación no tiene éxito, deténgase.


Un poco tarde, pero espero que ayude a alguien:

UPDATE user SET lastusedecnumber = LAST_INSERT_ID(lastusedecnumber + 1); SELECT LAST_INSERT_ID();

Le dará un incremento atómico del último número utilizado y la capacidad de leer el nuevo valor del campo del lastusedecnumber (después del incremento) utilizando SELECT LAST_INSERT_ID() .


Una solución mejor es crear una columna que contenga una marca de tiempo. Cuando quiera bloquear la fila, actualícela a la hora actual. Para desbloquear la actualización a un tiempo de al menos x minutos en el pasado. Luego, para verificar si está bloqueado, verifique que la marca de tiempo tenga al menos x minutos de antigüedad.

De esta manera, si el proceso falla (o el usuario nunca completa su operación), el bloqueo expira efectivamente después de x minutos.