2015-06-03 16 views

Antwort

8

Ein Stapel ist eine Sammlung von Vorgängen, die aus Effizienzgründen an den Server als Einheit gesendet werden. Dies entspricht dem Senden der gleichen Operationen wie einzelne Anforderungen von verschiedenen Threads. Anforderungen in einem Stapel können außerhalb der Reihenfolge ausgeführt werden, und einige Vorgänge in einem Stapel können erfolgreich ausgeführt werden, während andere fehlschlagen.

In Go werden Chargen mit dem Batcher-Objekt DB.B erstellt und müssen an DB.Run() übergeben werden. Zum Beispiel:

err := db.Run(db.B.Put("a", "1").Put("b", "2")) 

entsprechen:

_, err1 := db.Put("a", "1") 
_, err2 := db.Put("b", "2") 

A Transaktion eine konsistente und atomare Folge von Operationen definiert. Transaktionen gewährleisten die Konsistenz in Bezug auf alle anderen Vorgänge im System: Die Ergebnisse einer Transaktion werden erst angezeigt, wenn die Transaktion festgeschrieben wurde. Da Transaktionen möglicherweise wiederholt werden müssen, werden Transaktionen durch Funktionsobjekte (typischerweise Schließungen) definiert, die mehrmals aufgerufen werden können.

In Go werden Transaktionen mit der Methode DB.Tx erstellt. Der Parameter *client.Tx für den Abschluss implementiert eine ähnliche Schnittstelle wie ; Innerhalb der Transaktion müssen Sie alle Ihre Operationen für dieses Objekt anstelle der ursprünglichen DB ausführen. Wenn Ihre Funktion einen Fehler zurückgibt, wird die Transaktion abgebrochen. Andernfalls wird es festgeschrieben. Hier ist eine transaktionale Version des vorherigen Beispiels (aber unten für eine effizientere Version sehen):

err := db.Tx(func(tx *client.Tx) error { 
    err := tx.Put("a", "1") 
    if err != nil { 
     return err 
    } 
    return tx.Put("b", "2") 
}) 

Das vorherige Beispiel wartet auf dem „a“ den „b“ zu vervollständigen schreiben vor Beginn des Schreib, und dann wartet für das "b" schreiben, um vor der Übergabe der Transaktion abzuschließen. Es ist möglich, dies effizienter zu machen, indem Sie Stapel innerhalb der Transaktion verwenden. Tx.B ist ein Batcher-Objekt, genau wie DB.B. In einer Transaktion können Sie Stapel mit Tx.Run oder Tx.Commit ausführen. Tx.Commit wird die Transaktion nur dann festschreiben, wenn alle anderen Operationen im Stapel erfolgreich sind, und ist effizienter als die Transaktion automatisch festschreiben zu lassen, wenn der Abschluss zurückgegeben wird. Es ist eine gute Praxis, immer die letzte Operation in einer Transaktion eine Charge von Tx.Commit ausgeführt zu machen:

err := db.Tx(func(tx *client.Tx) error { 
    return tx.Commit(tx.B.Put("a", "1").Put("b", "2")) 
}) 
+0

Sie Ihre Antwort als Antwort markieren sollen, wird es sehr hilfreich sein –