Obtener datos no comprometidos en MySQL

En SQL Server podemos escribir debajo de SQL Queries para obtener datos no comprometidos en la base de datos. Esto significa que los datos que aún están en transacción y Transacción no están completos.

Consulta de SQL Server

 Select * from TableName With(NoLock); 

¿Hay alguna equivalencia en la base de datos MySQL para obtener datos, incluso si la tabla está bloqueada? Estoy intentando esto en PHP CodeIgnitor

Se encontró un artículo con el título ” Sintaxis MySQL NOLOCK

http://itecsoftware.com/with-nolock-table-hint-equivalent-for-mysql

SQL Server WITH (NOLOCK) se ve así:

 SELECT * FROM TABLE_NAME WITH (nolock) 

Para lograr lo mismo con MySQL, cambiamos el modo de aislamiento de sesión usando el comando SET SESSION .

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

Puedes lograr lo mismo por debajo también:

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

Esta afirmación funcionará de manera similar a WITH (NOLOCK), es decir, READ UNCOMMITTED . También podemos establecer el nivel de aislamiento para todas las conexiones a nivel mundial:

  SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; 

Además, existen dos variables de sistema relacionadas con el aislamiento también en el servidor MySQL:

 SELECT @@global.tx_isolation; (global isolation level) SELECT @@tx_isolation; (session isolation level) 

O establece el nivel de aislamiento dentro de una transacción:

 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ GO 

En el encendedor de código, puede ajustar su consulta con las dos primeras soluciones o puede usar la opción global.

para su referencia puede usar el siguiente código:

 $this->db->query("SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE"); $this->db->trans_start(); // your code $this->db->trans_complete(); 

Actualización 1:

Puede establecer el nivel de aislamiento en una consulta antes de ejecutar sus declaraciones. A continuación se muestra el código php mysqli simple tu uso isolation level read uncommited

 //db connection $mysqli = new mysqli('localhost', 'user', 'pass', 'db'); //set isolation level $mysqli->query("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED"); //your Select Query $results = $mysqli->query("SELECT * FROM tablename"); while($row = $results->fetch_assoc()) { //some statements } // Frees the memory associated with a result $results->free(); $mysqli->query("COMMIT"); // close connection $mysqli->close(); 
 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; SELECT * FROM TABLE_NAME ; COMMIT ; 

Referencia

Las instrucciones SELECT se realizan sin lockings, pero se puede usar una posible versión anterior de una fila. Por lo tanto, al usar este nivel de aislamiento, tales lecturas no son consistentes. Esto también se llama lectura sucia. De lo contrario, este nivel de aislamiento funciona como READ COMMITTED.

SERIALIZABLE

Este nivel es como REPEATABLE READ, pero InnoDB convierte implícitamente todas las declaraciones SELECT simples a SELECT … LOCK IN SHARE MODE si el autocommit está desactivado. Si la confirmación automática está habilitada, el SELECCIONAR es su propia transacción. Por lo tanto, se sabe que es de solo lectura y se puede serializar si se realiza como una lectura coherente (sin locking) y no necesita bloquearse para otras transacciones. (Para forzar un SELECT simple para bloquear si otras transacciones han modificado las filas seleccionadas, desactive la confirmación automática).

autocommit

 Command-Line Format --autocommit[=#] System Variable Name autocommit Variable Scope Global, Session Dynamic Variable Yes Permitted Values Type boolean Default ON 

El modo de confirmación automática. Si se establece en 1, todos los cambios en una tabla surten efecto de inmediato. Si se establece en 0, debe usar COMMIT para aceptar una transacción o ROLLBACK para cancelarla. Si autocommit es 0 y lo cambia a 1, MySQL realiza un COMMIT automático de cualquier transacción abierta. Otra forma de comenzar una transacción es usar una instrucción START TRANSACTION o BEGIN. Consulte la Sección 13.3.1, “INICIAR Sintaxis de TRANSACCIÓN, COMPROMISO y ROLLBACK” .

De forma predeterminada, las conexiones de los clientes comienzan con el compromiso automático establecido en 1. Para hacer que los clientes comiencen con un valor predeterminado de 0, configure el valor de autocommit global iniciando el servidor con la opción –autocommit = 0. Para establecer la variable usando un archivo de opciones, incluya estas líneas:

 [mysqld] autocommit=0 

Ver esto también

Dentro del encendedor de código, puede usar el siguiente comando antes de cualquier solicitud:

 $this->db->simple_query("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED"); 

Puede obtener más información sobre el nivel de aislamiento de MySQL en la documentación . Esto requiere tablas innoDB.

Para obtener más información acerca de simple_query() , según la documentación de codeigniter , se usa cuando una consulta no arroja ningún resultado.

Solo el motor de almacenamiento InnoDB es totalmente compatible con las transacciones. También implementa MVCC de Oracle / PostgreSQL que evita lockings de fila implícitos para bloquear lecturas. Para obtener Read-UnCommitted en InnoDB, emita SET TRANSACTION LEVEL READ UNCOMMITTED antes de emitir la consulta.

La syntax para hacerlo en PHP sería algo como esto:

 $dbh->exec('SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED'); $dbh->beginTransaction(); 

Esto establece el nivel de aislamiento hasta el próximo COMMIT o ROLLBACK . Para que el cambio de nivel persista durante la sesión, use

 SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

en lugar.

En cuanto a anular un locking de lectura sin compartir en una tabla o fila, no estoy seguro de que sea posible, ni puedo pensar en una situación en la que sería deseable. Los lockings que no se comparten generalmente no comparten por un motivo.