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

Was ist MySQL-optimistisches Sperren?

coldplay.xixi
Freigeben: 2020-06-29 15:56:42
Original
4795 Leute haben es durchsucht

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!

Verwandte Etiketten:
Quelle:php.cn
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage