Mysql
 sql >> Database >  >> RDS >> Mysql

Ottieni dati non impegnati in MySQL

Trovato un articolo con il titolo "Sintassi MySQL NOLOCK "

http://itecsoftware.com/with-nolock-table-hint -equivalente-per-mysql

SQL Server WITH (NOLOCK) si presenta così:

SELECT * FROM TABLE_NAME WITH (nolock)

Per ottenere lo stesso risultato con MySQL, cambiamo la modalità di isolamento della sessione utilizzando SET SESSION comando.

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

Puoi ottenere lo stesso anche di seguito:

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

Questa istruzione funzionerà in modo simile a WITH (NOLOCK), ovvero READ UNCOMMITTED dati. Possiamo anche impostare il livello di isolamento per tutte le connessioni a livello globale:

 SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;

Inoltre, nel server MySQL esistono anche due variabili di sistema relative al livello di isolamento:

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

Oppure imposta il livello di isolamento all'interno di una transazione:

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
GO

In code gniter puoi eseguire il wrapping della tua query con le prime due soluzioni oppure puoi utilizzare l'opzione globale.

come riferimento è possibile utilizzare il codice di seguito:

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

// your code

$this->db->trans_complete();

Aggiornamento 1:

Puoi semplicemente impostare il livello di isolamento in una query prima di eseguire le tue istruzioni. Di seguito è riportato il semplice codice php mysqli da utilizzare 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();