usuario update tipos pesimista optimista modos for ejemplo control concurrencia bloqueos bloqueo bloquear mysql locking

tipos - mysql select for update ejemplo



¿Alguna forma de seleccionar sin causar bloqueo en MySQL? (8)

De this referencia:

Si adquiere un bloqueo de tabla explícitamente con LOCK TABLES, puede solicitar un bloqueo de lectura local en lugar de un bloqueo de lectura para permitir que otras sesiones realicen inserciones simultáneas mientras tiene la tabla bloqueada.

Consulta:

SELECT COUNT(online.account_id) cnt from online;

Pero la tabla en línea también se modifica por un evento, por lo que con frecuencia puedo ver el bloqueo ejecutando show processlist .

¿Hay alguna gramática en MySQL que pueda hacer que la instrucción select no cause bloqueos?

Y he olvidado mencionar que está en una base de datos esclava MySQL.

Después de agregar en my.cnf:transaction-isolation = READ-UNCOMMITTED el esclavo se encontrará con un error:

Error ''Binary logging not possible. Message: Transaction level ''READ-UNCOMMITTED'' in InnoDB is not safe for binlog mode ''STATEMENT'''' on query

Entonces, ¿hay una forma compatible de hacer esto?


Dependiendo de su tipo de mesa, el bloqueo funcionará de manera diferente, pero también lo hará un conteo SELECCIONADO. Para las tablas MyISAM, una simple tabla SELECT count (*) FROM no debe bloquear la tabla, ya que accede a metadatos para extraer el recuento de registros. Innodb tomará más tiempo ya que tiene que tomar la mesa en una instantánea para contar los registros, pero no debe causar bloqueo.

Debería al menos tener concurrent_insert establecido en 1 (predeterminado). Luego, si no hay "lagunas" en el archivo de datos para que la tabla se llene, las inserciones se agregarán al archivo y SELECCIONAR e INSERTAR pueden ocurrir simultáneamente con las tablas MyISAM. Tenga en cuenta que eliminar un registro pone un "espacio" en el archivo de datos que intentará llenarse con inserciones y actualizaciones futuras.

Si rara vez borra registros, puede establecer concurrent_insert igual a 2 y las inserciones siempre se agregarán al final del archivo de datos. Luego, las selecciones y las inserciones pueden realizarse simultáneamente, pero su archivo de datos nunca se volverá más pequeño, sin importar cuántos registros elimine (excepto todos los registros).

El resultado final, si tiene muchas actualizaciones, inserta y selecciona en una tabla, debe hacerlo InnoDB. Sin embargo, puedes mezclar libremente tipos de tabla en un sistema.


Encontré un artículo titulado "MYSQL WITH NOLOCK"

https://web.archive.org/web/20100814144042/http://sqldba.org/articles/22-mysql-with-nolock.aspx

en MSSQL harías lo siguiente:

SELECT * FROM TABLE_NAME WITH (nolock)

y el equivalente MYSQL es

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; SELECT * FROM TABLE_NAME ; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ;

EDITAR

Michael Mior sugirió lo siguiente (a partir de los comentarios)

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; SELECT * FROM TABLE_NAME ; COMMIT ;


Es posible que desee leer esta página del manual de MySQL. La forma en que se bloquea una tabla depende del tipo de tabla que sea.

MyISAM usa bloqueos de tabla para lograr una velocidad de lectura muy alta, pero si tiene una instrucción UPDATE en espera, los SELECTS futuros se pondrán en cola detrás de UPDATE.

Las tablas InnoDB usan el bloqueo a nivel de fila, y no tendrá toda la tabla bloqueada detrás de una ACTUALIZACIÓN. Hay otro tipo de problemas de bloqueo asociados con InnoDB, pero es posible que encuentre que se ajusta a sus necesidades.


Los SELECT normalmente no hacen ningún bloqueo que te importe en tablas InnoDB. El nivel de aislamiento de transacción predeterminado significa que las selecciones no bloquean cosas.

Por supuesto, la disputa aún sucede.


Otra forma de habilitar la lectura sucia en mysql es añadir pista: BLOQUEO EN COMPARTIR SELECCIONAR MODO * DESDE TABLE_NAME BLOQUEO EN MODO COMPARTIR;


Si la tabla es InnoDB, vea http://dev.mysql.com/doc/refman/5.1/en/innodb-consistent-read.html - usa lectura consistente (modo sin bloqueo) para los SELECT "que sí no especifique FOR UPDATE o LOCK IN SHARE MODE si se establece la opción innodb_locks_unsafe_for_binlog y el nivel de aislamiento de la transacción no se establece en SERIALIZABLE. Por lo tanto, no se establecen bloqueos en las filas leídas de la tabla seleccionada ".


Utilizar

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED.

Los documentos de la versión 5.0 están aquí .

Los documentos de la versión 5.1 están here .