Heim PHP-Framework Laravel Analyse der Nutzungsprobleme der exklusiven Laravel-Sperre lockForUpdate()

Analyse der Nutzungsprobleme der exklusiven Laravel-Sperre lockForUpdate()

Jan 08, 2021 pm 01:56 PM
laravel

Für die exklusive Sperre von MySQL habe ich einen Test durchgeführt, um zu sehen, ob es einen exklusiven Effekt gibt.

Test 1: Testen Sie die exklusive Sperre auf der Befehlszeile

Erster Test auf der Befehlszeile, öffnen Sie zwei Befehlszeilen
Fügen Sie zuerst eine exklusive Sperre auf Befehlszeile 1 hinzu:

Testen Sie dann den Zugriff auf Befehlszeile 2 :


Sie können sehen, dass es tatsächlich blockiert ist, nachdem der Commit in Befehlszeile 1 abgeschlossen wurde, und das Ausführungsergebnis auch in Befehlszeile 2 ausgeführt wird.
Es ist also kein Problem, die exklusive Sperre in der Befehlszeile zu testen. laravel 排他锁 lockForUpdate() 使用问题

laravel 排他锁 lockForUpdate() 使用问题

Test 2: Testen Sie die exklusive Sperre in Laravel-Controller-Methode

Testen wir die exklusive Sperre in Laravel:
Zwei Routen:

Route::get('/locktest1','LockController@ LockTest1' );Route::get('/locktest2','LockController@LockTest2');LockTest1 und im Controller LockTest2 code>Der Inhalt dieser beiden Methoden ist derselbe:

DB::beginTransaction(); // 开启事务
$goods = Goods::lockForUpdate()->first();
print_r($goods);
Nach dem Login kopieren

Zuerst auf die Route /locktest1 zugreifen und die Daten normal ausdrucken. Ich persönlich vermute, dass die Transaktion zu diesem Zeitpunkt noch nicht abgeschlossen ist ist eine weitere Anfrage zum Zugriff auf die Datentabelle, die blockieren sollte.
Wenn ich hier also auf /locktest2 zugreife, werden die Daten normal ausgedruckt. Warum gibt es keine Sperrwirkung?
Route::get('/locktest1','LockController@LockTest1');
Route::get('/locktest2','LockController@LockTest2');
控制器中的 LockTest1LockTest2这两个方法内容都一样:

DB::beginTransaction(); // 开启事务
$goods = Goods::lockForUpdate()->first();
print_r($goods);sleep(10);echo 'ddd';
Nach dem Login kopieren

先访问路由/locktest1,正常打印出数据,个人猜想此时事务没有关闭,如果再有访问数据表的请求,应该是阻塞的。
所以在此访问/locktest2,结果还是正常打印出数据,为什么没有产生阻塞效果呢?

测试3:laravel控制器方法与命令行混合测试排他锁

1、先在命令行里开启事务添加排他锁,同测试1里的命令行1的操作;
然后访问路由/locktest1,页面一直运行中,说明查询数据存在阻塞;
最后命令行里commit提交。
2、先访问路由/locktest1,正常打印出数据;
然后在命令行里开启事务添加排他锁,同测试1里的命令行1的操作,发现正常查询出数据,没有阻塞;说明laravel的控制器方法里的排他锁操作确实没有成功。

总结:为什么laravel的lockForUpdate()没有效果呢,还是说laravel控制器方法执行完毕后,会自动结束事务才导致没有阻塞效果的?

于是,再次做下面测试:
将路由1的控制器方法里加了一个sleep()方法:

rrreee

然后,访问路由1/locktest1,页面在等待刷新;再访问路由2/locktest2,页面也在等待刷新,说明应该是产生数据阻塞了,因为路由2中没有sleep(),正常情况下是立即执行的。
10秒过后,/locktest1页面打印出数据,同时/locktest2

Test 3: Laravel-Controller-Methode und Befehlszeilentest mit exklusiver Sperre

1 Öffnen Sie zunächst die Transaktion in der Befehlszeile, um eine exklusive Sperre hinzuzufügen, genau wie die Operation von Befehlszeile 1 in Test 1;

Dann greifen Sie auf die Route /locktest1 zu, die Seite wurde ausgeführt, was darauf hinweist, dass die Abfragedaten blockiert sind.

Schließlich in der Befehlszeile festschreiben. 2. Greifen Sie zuerst auf die Route /locktest1 zu und drucken Sie die Daten normal aus. Dann öffnen Sie die Transaktion in der Befehlszeile, um eine exklusive Sperre hinzuzufügen. Das wurde mit der gleichen Operation wie in Befehlszeile 1 gefunden Die Daten werden normal abgefragt. Es gibt keine Blockierung. Dies bedeutet, dass der exklusive Sperrvorgang in der Controller-Methode von Laravel nicht erfolgreich war.

🎜🎜🎜🎜🎜Zusammenfassung: Warum hat lockForUpdate() von Laravel keine Wirkung? Oder wird die Transaktion automatisch beendet, nachdem die Laravel-Controller-Methode ausgeführt wurde, was zu keiner blockierenden Wirkung führt? 🎜🎜🎜Führen Sie also den folgenden Test noch einmal durch: 🎜Fügen Sie eine Sleep()-Methode zur Controller-Methode von Route 1 hinzu: 🎜rrreee🎜Dann besuchen Sie Route 1 /locktest1, die Seite wartet darauf, geöffnet zu werden aktualisiert; dann Beim Zugriff auf Route 2 /locktest2 wartet die Seite ebenfalls auf die Aktualisierung, was darauf hinweist, dass Daten blockiert werden sollten, da in Route 2 kein Sleep () vorhanden ist und sie sofort ausgeführt wird normale Umstände. 🎜Nach 10 Sekunden druckt die Seite /locktest1 Daten aus, und die Seite /locktest2 druckt ebenfalls Daten aus. 🎜🎜🎜🎜 Demnach hat der obige Test 3 keinen Sperreffekt erzeugt, der durch das automatische Ende der Transaktion nach Beendigung der Controller-Methode verursacht werden sollte. 🎜🎜Das Obige ist eine persönliche Analyse. Wenn ein Meister vorbeikommt, hinterlassen Sie mir bitte eine Nachricht, um mir die richtige Antwort zu sagen! 🎜🎜Weitere Kenntnisse zum Thema Programmierung finden Sie unter: 🎜Programmierlehre🎜! ! 🎜

Das obige ist der detaillierte Inhalt vonAnalyse der Nutzungsprobleme der exklusiven Laravel-Sperre lockForUpdate(). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie bekomme ich den Rückgabecode, wenn das Senden von E -Mails in Laravel fehlschlägt? Wie bekomme ich den Rückgabecode, wenn das Senden von E -Mails in Laravel fehlschlägt? Apr 01, 2025 pm 02:45 PM

Methode zum Abholen des Rücksendecode, wenn das Senden von Laravel -E -Mails fehlschlägt. Wenn Sie Laravel zur Entwicklung von Anwendungen verwenden, stellen Sie häufig Situationen auf, in denen Sie Überprüfungscodes senden müssen. Und in Wirklichkeit ...

Laravel -Zeitplanaufgabe wird nicht ausgeführt: Was soll ich tun, wenn die Aufgabe nicht nach Zeitplan ausgeführt wird: Befehl ausführen? Laravel -Zeitplanaufgabe wird nicht ausgeführt: Was soll ich tun, wenn die Aufgabe nicht nach Zeitplan ausgeführt wird: Befehl ausführen? Mar 31, 2025 pm 11:24 PM

Laravel -Zeitplan -Aufgabe Ausführen nicht reagierende Fehlerbehebung Bei Verwendung der Zeitplanung von Laravel -Zeitplänen werden viele Entwickler auf dieses Problem stoßen: Zeitplan: Run ...

Wie kann man in Laravel mit der Situation umgehen, in der Überprüfungscodes nicht per E -Mail gesendet werden? Wie kann man in Laravel mit der Situation umgehen, in der Überprüfungscodes nicht per E -Mail gesendet werden? Mar 31, 2025 pm 11:48 PM

Die Methode zum Umgang mit Laravels E -Mail -Versagen zum Senden von Verifizierungscode besteht darin, Laravel zu verwenden ...

So implementieren Sie die benutzerdefinierte Tabellenfunktion des Klickens, um Daten im DCAT -Administrator hinzuzufügen? So implementieren Sie die benutzerdefinierte Tabellenfunktion des Klickens, um Daten im DCAT -Administrator hinzuzufügen? Apr 01, 2025 am 07:09 AM

So implementieren Sie die Tabellenfunktion von benutzerdefiniertem Klicken, um Daten in dcatadmin (laravel-admin) hinzuzufügen, wenn Sie DCAT verwenden ...

Laravel – Dump-Server Laravel – Dump-Server Aug 27, 2024 am 10:51 AM

Laravel – Dump-Server – Der Laravel-Dump-Server wird mit der Version von Laravel 5.7 geliefert. Die Vorgängerversionen enthalten keinen Dump-Server. Der Dump-Server wird eine Entwicklungsabhängigkeit in der Laravel-/Laravel-Composer-Datei sein.

Laravel Redis -Verbindungsfreigabe: Warum wirkt sich die Auswahlmethode auf andere Verbindungen aus? Laravel Redis -Verbindungsfreigabe: Warum wirkt sich die Auswahlmethode auf andere Verbindungen aus? Apr 01, 2025 am 07:45 AM

Die Auswirkungen des Austauschs von Redis -Verbindungen im Laravel -Framework und der Auswahl von Methoden bei Verwendung von Laravel -Framework und Redis können Entwickler auf ein Problem stoßen: Durch Konfiguration ...

Laravel Multi-Tenant-Erweiterungsstanz/Mietverhältnis: Wie passen Sie die Host-Adresse einer Mieterdatenbankverbindung an? Laravel Multi-Tenant-Erweiterungsstanz/Mietverhältnis: Wie passen Sie die Host-Adresse einer Mieterdatenbankverbindung an? Apr 01, 2025 am 09:09 AM

Benutzerdefinierte Mieterdatenbankverbindung in Laravel Multi-Tenant-Erweiterungspaket Stanz/Mietverhältnis beim Erstellen von Multi-Mandanten-Anwendungen mit Laravel Multi-Tenant-Erweiterungspaket Stanz/Mietverhältnis, ...

Laravel – Aktions-URL Laravel – Aktions-URL Aug 27, 2024 am 10:51 AM

Laravel – Aktions-URL – Laravel 5.7 führt eine neue Funktion namens „Aufrufbare Aktions-URL“ ein. Diese Funktion ähnelt der in Laravel 5.6, die String-in-Action-Methoden akzeptiert. Der Hauptzweck der neuen Syntax, die Laravel 5.7 eingeführt hat, besteht darin, direktl

See all articles