Heim Datenbank MySQL-Tutorial Was ist MySQL-optimistisches Sperren?

Was ist MySQL-optimistisches Sperren?

Jun 29, 2020 pm 03:56 PM
mysql optimistische Verriegelung

Im Vergleich zum pessimistischen Sperren von MySQL wird davon ausgegangen, dass die Daten unter normalen Umständen keine Konflikte verursachen. Wenn die Daten also zur Aktualisierung übermittelt werden, wird der Konflikt der Daten offiziell erkannt Wenn ein Konflikt gefunden wird, werden Fehlerinformationen an den Benutzer zurückgegeben und der Benutzer kann entscheiden, was zu tun ist.

Was ist MySQL-optimistisches Sperren?

Das optimistische Sperren von MySQL ist (optimistisches Sperren). Im Vergleich zum pessimistischen Sperren geht das optimistische Sperren davon aus, dass Daten im Allgemeinen keine Konflikte verursachen Wenn die Daten zur Aktualisierung übermittelt werden, wird der Datenkonflikt offiziell erkannt. Wenn ein Konflikt festgestellt wird, wird eine Fehlermeldung an den Benutzer zurückgegeben, sodass der Benutzer entscheiden kann, was zu tun ist.

Wie implementieren wir also optimistisches Sperren? Im Allgemeinen gibt es zwei Möglichkeiten:

1. Verwenden Sie den Datenversionsaufzeichnungsmechanismus, um zu implementieren optimistisch Eine der am häufigsten verwendeten Implementierungsmethoden für Sperren. Was ist eine Datenversion? Dabei wird den Daten eine Versionskennung hinzugefügt, normalerweise durch Hinzufügen eines numerischen „Version“-Felds zur Datenbanktabelle. Beim Lesen von Daten wird der Wert des Versionsfelds zusammen gelesen. Bei jeder Aktualisierung der Daten wird der Versionswert um eins erhöht.

Wenn wir ein Update einreichen, vergleichen wir die aktuellen Versionsinformationen des entsprechenden Datensatzes in der Datenbanktabelle mit dem zum ersten Mal entnommenen Versionswert Der Versionswert wurde zum ersten Mal herausgenommen. Wenn er gleich ist, wird er aktualisiert, andernfalls wird er als abgelaufene Daten betrachtet. Verwenden Sie zur Veranschaulichung das folgende Bild:

Was ist MySQL-optimistisches Sperren?

Wie im Bild oben gezeigt, werden die Versionen der Daten nacheinander ohne Konflikte erhöht, wenn die Aktualisierungsvorgänge nacheinander ausgeführt werden. Wenn jedoch verschiedene Geschäftsvorgänge dieselbe Datenversion ändern, aktualisiert der zuerst übermittelte Vorgang (B in der Abbildung) die Datenversion auf 2. Wenn A die Aktualisierung nach B übermittelt, wird festgestellt, dass die Datenversion geändert wurde . , dann schlägt der Aktualisierungsvorgang von A fehl.

2. Die zweite Implementierungsmethode des optimistischen Sperrens ähnelt der ersten. Sie fügt der Tabelle auch ein Feld hinzu, das eine optimistische Sperrsteuerung erfordert . , der Name spielt keine Rolle, der Feldtyp verwendet einen Zeitstempel, der der obigen Version ähnelt. Bei der Übermittlung des Updates wird der Zeitstempel der Daten in der aktuellen Datenbank überprüft und mit dem vorab erhaltenen Zeitstempel verglichen Wenn sie konsistent sind, ist das in Ordnung, andernfalls handelt es sich um einen Versionskonflikt.

Verwandte Lernempfehlungen:

MySQL-Video-Tutorial

Verwendungsbeispiele:

mit

Als Beispiel MySQL InnoDB

nehmen wir das vorherige Beispiel: In der Warentabelle gibt es ein Feld Status. Ein Status von 1 bedeutet, dass das Produkt nicht bestellt wurde, und ein Status von 2 bedeutet, dass das Produkt bestellt wurde Dann werden wir bei der Bestellung eines Produkts sicherstellen, dass der Status des Produkts 1 ist. Gehen Sie davon aus, dass die Produkt-ID 1 ist.

Der Bestellvorgang umfasst 3 Schritte:

1. Fragen Sie die Produktinformationen ab

select (status,status,version) from t_goods where id=#{id}
Nach dem Login kopieren

Generieren Sie eine Bestellung basierend auf den Produktinformationen

3. Ändern Sie den Produktstatus auf 2

update t_goods 
set status=2,version=version+1
where id=#{id} and version=#{version};
Nach dem Login kopieren

Um die t_goods-Tabelle zu verwenden, ändern wir zunächst ein Versionsfeld Daten sind 1.

Die Anfangsdaten der Tabelle lauten wie folgt: t_goods

mysql> select * from t_goods;  
+----+--------+------+---------+  
| id | status | name | version |  
+----+--------+------+---------+  
|  1 |      1 | 道具 |       1 |  
|  2 |      2 | 装备 |       2 |  
+----+--------+------+---------+  
2 rows in set  
  
mysql>
Nach dem Login kopieren

Für die Implementierung des optimistischen Sperrens verwende ich MyBatis zum Üben wie folgt:

Waren-Entitätsklasse:

/** 
 * ClassName: Goods <br/> 
 * Function: 商品实体. <br/> 
 * date: 2013-5-8 上午09:16:19 <br/> 
 * @author chenzhou1025@126.com 
 */  
public class Goods implements Serializable {  
  
    /** 
     * serialVersionUID:序列化ID. 
     */  
    private static final long serialVersionUID = 6803791908148880587L;  
      
    /** 
     * id:主键id. 
     */  
    private int id;  
      
    /** 
     * status:商品状态:1未下单、2已下单. 
     */  
    private int status;  
      
    /** 
     * name:商品名称. 
     */  
    private String name;  
      
    /** 
     * version:商品数据版本号. 
     */  
    private int version;  
      
    @Override  
    public String toString(){  
        return "good id:"+id+",goods status:"+status+",goods name:"+name+",goods version:"+version;  
    }  
  
    //setter and getter  
  
}
Nach dem Login kopieren

GoodsDao

/** 
 * updateGoodsUseCAS:使用CAS(Compare and set)更新商品信息. <br/> 
 * 
 * @author chenzhou1025@126.com 
 * @param goods 商品对象 
 * @return 影响的行数 
 */  
int updateGoodsUseCAS(Goods goods);
Nach dem Login kopieren

mapper.xml

<update id="updateGoodsUseCAS" parameterType="Goods">  
    <![CDATA[ 
        update t_goods 
        set status=#{status},name=#{name},version=version+1 
        where id=#{id} and version=#{version} 
    ]]>  
</update>
Nach dem Login kopieren

GoodsDaoTesttest Klasse

@Test  
public void goodsDaoTest(){  
    int goodsId = 1;  
    //根据相同的id查询出商品信息,赋给2个对象  
    Goods goods1 = this.goodsDao.getGoodsById(goodsId);  
    Goods goods2 = this.goodsDao.getGoodsById(goodsId);  
      
    //打印当前商品信息  
    System.out.println(goods1);  
    System.out.println(goods2);  
      
    //更新商品信息1  
    goods1.setStatus(2);//修改status为2  
    int updateResult1 = this.goodsDao.updateGoodsUseCAS(goods1);  
    System.out.println("修改商品信息1"+(updateResult1==1?"成功":"失败"));  
      
    //更新商品信息2  
    goods1.setStatus(2);//修改status为2  
    int updateResult2 = this.goodsDao.updateGoodsUseCAS(goods1);  
    System.out.println("修改商品信息2"+(updateResult2==1?"成功":"失败"));  
}
Nach dem Login kopieren

Ausgabeergebnis:

good id:1,goods status:1,goods name:道具,goods version:1  
good id:1,goods status:1,goods name:道具,goods version:1  
修改商品信息1成功  
修改商品信息2失败
Nach dem Login kopieren

Beschreibung:

In der Testmethode

finden wir die gleiche Datenversion gleichzeitig und weisen Sie es verschiedenen Warenobjekten zu, ändern Sie dann zuerst das Objekt good1 und führen Sie dann den Aktualisierungsvorgang aus. Die Ausführung ist erfolgreich. Dann ändern wir Waren2, und wenn wir den Aktualisierungsvorgang ausführen, werden wir darauf hingewiesen, dass der Vorgang fehlgeschlagen ist. Zu diesem Zeitpunkt lauten die Daten in der GoodsDaoTest-Tabelle wie folgt: t_goods

mysql> select * from t_goods;  
+----+--------+------+---------+  
| id | status | name | version |  
+----+--------+------+---------+  
|  1 |      2 | 道具 |       2 |  
|  2 |      2 | 装备 |       2 |  
+----+--------+------+---------+  
2 rows in set  
  
mysql>
Nach dem Login kopieren

Wir können sehen, dass die Datenversion mit der ID 1 beim ersten Update in 2 geändert wurde. Wenn wir also good2 aktualisieren, stimmt die Aktualisierungsbedingung nicht mehr überein, sodass die Aktualisierung nicht erfolgreich ist. Die spezifische SQL lautet wie folgt:

update t_goods   
set status=2,version=version+1  
where id=#{id} and version=#{version};
Nach dem Login kopieren

Auf diese Weise haben wir eine optimistische Sperre erreicht.

Das obige ist der detaillierte Inhalt vonWas ist MySQL-optimistisches Sperren?. 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

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

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)

MySQL: Einfache Konzepte für einfaches Lernen MySQL: Einfache Konzepte für einfaches Lernen Apr 10, 2025 am 09:29 AM

MySQL ist ein Open Source Relational Database Management System. 1) Datenbank und Tabellen erstellen: Verwenden Sie die Befehle erstellte und creatEtable. 2) Grundlegende Vorgänge: Einfügen, aktualisieren, löschen und auswählen. 3) Fortgeschrittene Operationen: Join-, Unterabfrage- und Transaktionsverarbeitung. 4) Debugging -Fähigkeiten: Syntax, Datentyp und Berechtigungen überprüfen. 5) Optimierungsvorschläge: Verwenden Sie Indizes, vermeiden Sie ausgewählt* und verwenden Sie Transaktionen.

Wie man phpmyadmin öffnet Wie man phpmyadmin öffnet Apr 10, 2025 pm 10:51 PM

Sie können PhpMyAdmin in den folgenden Schritten öffnen: 1. Melden Sie sich beim Website -Bedienfeld an; 2. Finden und klicken Sie auf das Symbol phpmyadmin. 3. Geben Sie MySQL -Anmeldeinformationen ein; 4. Klicken Sie auf "Login".

So erstellen Sie Navicat Premium So erstellen Sie Navicat Premium Apr 09, 2025 am 07:09 AM

Erstellen Sie eine Datenbank mit Navicat Premium: Stellen Sie eine Verbindung zum Datenbankserver her und geben Sie die Verbindungsparameter ein. Klicken Sie mit der rechten Maustaste auf den Server und wählen Sie Datenbank erstellen. Geben Sie den Namen der neuen Datenbank und den angegebenen Zeichensatz und die angegebene Kollektion ein. Stellen Sie eine Verbindung zur neuen Datenbank her und erstellen Sie die Tabelle im Objektbrowser. Klicken Sie mit der rechten Maustaste auf die Tabelle und wählen Sie Daten einfügen, um die Daten einzufügen.

So erstellen Sie eine neue Verbindung zu MySQL in Navicat So erstellen Sie eine neue Verbindung zu MySQL in Navicat Apr 09, 2025 am 07:21 AM

Sie können eine neue MySQL -Verbindung in Navicat erstellen, indem Sie den Schritten folgen: Öffnen Sie die Anwendung und wählen Sie eine neue Verbindung (Strg N). Wählen Sie "MySQL" als Verbindungstyp. Geben Sie die Hostname/IP -Adresse, den Port, den Benutzernamen und das Passwort ein. (Optional) Konfigurieren Sie erweiterte Optionen. Speichern Sie die Verbindung und geben Sie den Verbindungsnamen ein.

MySQL: Eine Einführung in die beliebteste Datenbank der Welt MySQL: Eine Einführung in die beliebteste Datenbank der Welt Apr 12, 2025 am 12:18 AM

MySQL ist ein Open Source Relational Database Management -System, das hauptsächlich zum schnellen und zuverlässigen Speicher und Abrufen von Daten verwendet wird. Sein Arbeitsprinzip umfasst Kundenanfragen, Abfragebedingungen, Ausführung von Abfragen und Rückgabergebnissen. Beispiele für die Nutzung sind das Erstellen von Tabellen, das Einsetzen und Abfragen von Daten sowie erweiterte Funktionen wie Join -Operationen. Häufige Fehler umfassen SQL -Syntax, Datentypen und Berechtigungen sowie Optimierungsvorschläge umfassen die Verwendung von Indizes, optimierte Abfragen und die Partitionierung von Tabellen.

MySQL und SQL: Wesentliche Fähigkeiten für Entwickler MySQL und SQL: Wesentliche Fähigkeiten für Entwickler Apr 10, 2025 am 09:30 AM

MySQL und SQL sind wesentliche Fähigkeiten für Entwickler. 1.MYSQL ist ein Open -Source -Relational Database Management -System, und SQL ist die Standardsprache, die zum Verwalten und Betrieb von Datenbanken verwendet wird. 2.MYSQL unterstützt mehrere Speichermotoren durch effiziente Datenspeicher- und Abruffunktionen, und SQL vervollständigt komplexe Datenoperationen durch einfache Aussagen. 3. Beispiele für die Nutzung sind grundlegende Abfragen und fortgeschrittene Abfragen wie Filterung und Sortierung nach Zustand. 4. Häufige Fehler umfassen Syntaxfehler und Leistungsprobleme, die durch Überprüfung von SQL -Anweisungen und Verwendung von Erklärungsbefehlen optimiert werden können. 5. Leistungsoptimierungstechniken umfassen die Verwendung von Indizes, die Vermeidung vollständiger Tabellenscanning, Optimierung von Join -Operationen und Verbesserung der Code -Lesbarkeit.

So verwenden Sie ein einzelnes Gewinde -Redis So verwenden Sie ein einzelnes Gewinde -Redis Apr 10, 2025 pm 07:12 PM

Redis verwendet eine einzelne Gewindearchitektur, um hohe Leistung, Einfachheit und Konsistenz zu bieten. Es wird E/A-Multiplexing, Ereignisschleifen, nicht blockierende E/A und gemeinsame Speicher verwendet, um die Parallelität zu verbessern, jedoch mit Einschränkungen von Gleichzeitbeschränkungen, einem einzelnen Ausfallpunkt und ungeeigneter Schreib-intensiver Workloads.

So wiederherstellen Sie Daten nach dem Löschen von SQL Zeilen So wiederherstellen Sie Daten nach dem Löschen von SQL Zeilen Apr 09, 2025 pm 12:21 PM

Das Wiederherstellen von gelöschten Zeilen direkt aus der Datenbank ist normalerweise unmöglich, es sei denn, es gibt einen Backup- oder Transaktions -Rollback -Mechanismus. Schlüsselpunkt: Transaktionsrollback: Führen Sie einen Rollback aus, bevor die Transaktion Daten wiederherstellt. Sicherung: Regelmäßige Sicherung der Datenbank kann verwendet werden, um Daten schnell wiederherzustellen. Datenbank-Snapshot: Sie können eine schreibgeschützte Kopie der Datenbank erstellen und die Daten wiederherstellen, nachdem die Daten versehentlich gelöscht wurden. Verwenden Sie eine Löschanweisung mit Vorsicht: Überprüfen Sie die Bedingungen sorgfältig, um das Verhandlich von Daten zu vermeiden. Verwenden Sie die WHERE -Klausel: Geben Sie die zu löschenden Daten explizit an. Verwenden Sie die Testumgebung: Testen Sie, bevor Sie einen Löschvorgang ausführen.

See all articles