2015-06-03 14 views

risposta

8

A batch è una raccolta di operazioni che vengono inviate al server come una singola unità per l'efficienza. È equivalente all'invio delle stesse operazioni delle singole richieste da diversi thread. Le richieste in un batch possono essere eseguite fuori servizio ed è possibile che alcune operazioni in un batch abbiano esito positivo mentre altre falliscono.

In Go, i lotti vengono creati con l'oggetto batcher DB.B e devono essere passati a DB.Run(). Ad esempio:

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

è equivalente a:

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

Un transazione definisce una sequenza coerente e atomico di operazioni. Le transazioni garantiscono la coerenza rispetto a tutte le altre operazioni nel sistema: i risultati di una transazione non possono essere visualizzati a meno che e fino a quando la transazione non viene eseguita. Dal momento che le transazioni potrebbero dover essere riprovate, le transazioni sono definite da oggetti funzione (in genere chiusure) che possono essere chiamate più volte.

In Go, le transazioni vengono create con il metodo DB.Tx. Il parametro *client.Tx alla chiusura implementa un'interfaccia simile a DB; all'interno della transazione è necessario eseguire tutte le operazioni su questo oggetto anziché sul DB originale. Se la tua funzione restituisce un errore, la transazione verrà interrotta; altrimenti si impegnerà. Ecco una versione transazionale dell'esempio precedente (ma vedi sotto per una versione più efficiente):

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

L'esempio precedente attende le attese "a" scrivere per completare prima di iniziare la "b" di scrittura, e poi per la scrittura "b" da completare prima di eseguire la transazione. È possibile renderlo più efficiente utilizzando i batch all'interno della transazione. Tx.B è un oggetto batcher, proprio come DB.B. In una transazione, è possibile eseguire batch con Tx.Run o Tx.Commit. Tx.Commit effettuerà il commit della transazione se e solo se tutte le altre operazioni nel batch hanno esito positivo ed è più efficiente che consentire il commit automatico della transazione al momento della restituzione della chiusura. Si tratta di una buona pratica di fare sempre l'ultima operazione in una transazione un batch eseguito da Tx.Commit:

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

si dovrebbe contrassegnare la risposta come la risposta, sarà molto utile –

Problemi correlati