2015-07-23 9 views
5

ich nicht MySQL-Tabellen mit dieser Abfrage sperren:Tabelle Verriegelungs Probleme mit Laravel 5.1

DB::statement('LOCK TABLES imports WRITE'); 

Es gibt jene Ausnahme:

[Illuminate\Database\QueryException] 

SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute. (SQL: LOCK TABLES imports WRITE)

Der gleiche Fehler tritt auf, wenn ich PDO .

Wie sollte ich das verwenden?

+0

Versuchen Sie 'DB :: connection() -> getPdo() -> setAttribute (PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY, wahr);'. – Siper

+0

Okay, ich sehe in Docs und Sie können Tabelle nur für Update oder für Freigabe sperren. Das kannst du mit 'DB :: table ('imports') -> lock ($ lockUpdate);' – Siper

Antwort

2
// prevent rows from being modified until you're finished 
DB::table('imports')->where('total', '>', 10)->sharedLock()->get(); 

Verwenden lockForUpdate() zu verhindern, anstatt Zeilen aus mit einer anderen gemeinsamen Sperre geändert oder ausgewählt werden.

+5

Hallo, wann wird die Sperre freigegeben? – supersan

+0

Hinweis: sharedLock sperrt das Schreiben in eine * Zeile * (keine Tabelle). Um Ihre Frage Supersan zu beantworten, wird es freigegeben, sobald die Transaktion abgeschlossen ist. – jonlink

5

Wenn Sie die ganze Tabelle sperren, und Sie wollen LOCK TABLES table_name WRITE verwenden, um es DB::unprepared('LOCK TABLES imports WRITE'); auf diese Weise werden nennen sollte, aber wenn Sie Sperre anwenden möchten auf den ausgewählten Zeilen dann mit sharedLock() oder lockForUpdate() der richtige Weg ist, das zu tun Es wird also nur die ausgewählten Zeilen zurückgeben und sperren.

+1

NB: Dies wird die Tabelle für lesen * und * schreiben sperren. Es bleibt gesperrt, bis 'DB :: unvorbereitet ('UNLOCK TABLES')' verwendet wird. – jonlink