2015-11-25 12 views
14

In SQL Server è possibile scrivere sotto SQL Queries per ottenere dati non impegnati nel database. Ciò significa che i dati ancora in corso di transazione e Transazione non sono completi.Ottenere dati non gestiti in MySQL

SQL Server Query

Select * from TableName With(NoLock); 

C'è qualche equivalenza database MySQL per ottenere i dati anche se la tabella è bloccata? Sto provando questo in PHP CodeIgnitor

+0

bisogno di codice di esempio sotto forma di PHP e MySQL per l'interazione del database – Pankaj

+0

vedono questo può aiutare a http: // StackOverflow.it/questions/917640/any-way-to-select-senza-causare-locking-in-mysql – Linus

risposta

1

Solo il motore di archiviazione InnoDB supporta pienamente le transazioni. Implementa anche MVCC in stile Oracle/PostgreSQL che impedisce blocchi impliciti delle righe di bloccare le letture. Per ottenere la lettura non inoltrata in InnoDB, emettere un SET TRANSACTION LEVEL READ UNCOMMITTED prima di inviare la query.

La sintassi per farlo in PHP sarebbe simile a questa:

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

Consente di impostare il livello di isolamento fino al prossimo COMMIT o ROLLBACK. Per rendere persistente la modifica del livello per la durata della sessione, utilizzare invece

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

.

Per quanto riguarda l'override di un blocco di lettura non condiviso su un tavolo o una riga, non sono sicuro che sia possibile, né posso pensare a una situazione in cui sarebbe auspicabile. I blocchi non di condivisione di solito non sono condivisi per un motivo.

+1

Richiesto codice di esempio sotto forma di PHP e MySQL per l'interazione tra database – Pankaj

+0

MyISAM non ha consapevolezza della transazione. Non c'è "commit". L'intera tabella è bloccata fino al termine della query, quindi non c'è modo di vedere i dati "non salvati". –

1

Le istruzioni SELECT vengono eseguite in modo non bloccante, ma potrebbe essere utilizzata una possibile versione precedente di una riga. Quindi, usando questo livello di isolamento, tali letture non sono coerenti. Questo è anche chiamato una lettura sporca. Altrimenti, questo livello di isolamento funziona come READ COMMITTED.

SERIALIZABLE

Questo livello è come REPEATABLE LEGGI, ma InnoDB converte implicitamente tutta pianura istruzioni SELECT per selezionare ... BLOCCO IN MODALITÀ SHARE se autocommit è disattivata. Se autocommit è abilitato, SELECT è la propria transazione. Pertanto, è noto per essere di sola lettura e può essere serializzato se eseguito come una lettura coerente (senza blocco) e non deve essere bloccato per altre transazioni. (Per forzare una pianura scegliere di bloccare se altre transazioni hanno modificato le righe selezionate, autocommit disattivare.)

autocommit

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

La modalità autocommit. Se impostato su 1, tutte le modifiche apportate a una tabella diventano immediatamente effettive. Se impostato su 0, è necessario utilizzare COMMIT per accettare una transazione o ROLLBACK per annullarlo. Se autocommit è 0 e lo si cambia in 1, MySQL esegue un COMMIT automatico di qualsiasi transazione aperta. Un altro modo per iniziare una transazione è utilizzare un'istruzione START TRANSACTION o BEGIN. Vedi Section 13.3.1, “START TRANSACTION, COMMIT, and ROLLBACK Syntax”.

Per impostazione predefinita, le connessioni client iniziano con l'autocommit impostato su 1. Per fare in modo che i client inizino con un valore predefinito di 0, impostare il valore di autocommit globale avviando il server con l'opzione --autocommit = 0.Per impostare la variabile utilizzando un file di opzioni, includere queste righe:

[mysqld] 
autocommit=0 

See This also

+0

Ho bisogno di codice di esempio sotto forma di PHP e MySQL per l'interazione con il database – Pankaj

+0

Penso che qualsiasi cosa tu selezioni con il tuo php non sia impegnata a meno che non la impegni. –

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

Reference

1

All'interno codeigniter, è possibile utilizzare il seguente comando prima di qualsiasi richiesta:

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

È possibile ottenere ulteriori informazioni su MySQL isolation level in the documentation. Ciò richiede tabelle innoDB.

Per ulteriori informazioni su simple_query(), secondo codeigniter documentation, viene utilizzato quando una query non restituisce alcun risultato.

+0

Richiesto codice di esempio sotto forma di PHP e MySQL per l'interazione tra database – Pankaj

+0

@Helper Questo è già PHP e MySQL. Se il tuo problema non riguarda codeigniter, devi usare 'mysqli_query()' invece di '$ this-> db-> simple_query()'. – Adam

9

trovato un articolo con il titolo "la sintassi MySQL NOLOCK"

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

SQL Server CON (NOLOCK) si presenta così:

SELECT * FROM TABLE_NAME WITH (nolock) 

per ottenere lo stesso con MySQL, abbiamo modificare la modalità di isolamento della sessione utilizzando il comando SET SESSION.

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

È possibile achive stessi da parte di seguito anche:

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

Questa dichiarazione funzionerà simile al CON (NOLOCK) cioè 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, due variabili di sistema legati all'isolamento anche il livello esistono nel server MySQL:

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

o impostare il livello di isolamento all'interno di una transazione :

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ 
GO 

Nel codice di accensione è possibile avvolgere la query con le prime due soluzioni oppure è possibile utilizzare l'opzione globale.

per il vostro riferimento è possibile utilizzare il codice qui sotto:

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

// your code 

$this->db->trans_complete(); 

Update 1:

Si può solo impostare il livello di isolamento in una query prima di eseguire le sue dichiarazioni. Di seguito è riportato il semplice codice php mysqli tu 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(); 
+0

È necessario codice di esempio sotto forma di PHP e MySQL per l'interazione tra database – Pankaj

+0

@Helper vedere codice php di esempio per lo stesso –