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.
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:
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:
Verwendungsbeispiele:
mit Als Beispiel MySQL InnoDB
Der Bestellvorgang umfasst 3 Schritte:
1. Fragen Sie die Produktinformationen abselect (status,status,version) from t_goods where id=#{id}
update t_goods set status=2,version=version+1 where id=#{id} and version=#{version};
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>
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 }
GoodsDao
/** * updateGoodsUseCAS:使用CAS(Compare and set)更新商品信息. <br/> * * @author chenzhou1025@126.com * @param goods 商品对象 * @return 影响的行数 */ int updateGoodsUseCAS(Goods goods);
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>
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?"成功":"失败")); }
good id:1,goods status:1,goods name:道具,goods version:1 good id:1,goods status:1,goods name:道具,goods version:1 修改商品信息1成功 修改商品信息2失败
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>
update t_goods set status=2,version=version+1 where id=#{id} and version=#{version};
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!