2015-06-03 36 views

回答

8

A 批次是爲了提高效率而作爲單個單元發送到服務器的操作的集合。它相當於發送與來自不同線程的單個請求相同的操作。批處理中的請求可能無序執行,批處理中的某些操作可能成功,而其他操作可能會失敗。

在Go中,使用批處理對象DB.B創建批次,並且必須傳遞給DB.Run()。例如:

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

相當於:

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

交易限定操作的一致的和原子序列。事務處理保證系統中所有其他操作的一致性:除非事務處理完成,否則事務處理的結果將不可見。由於事務可能需要重試,所以事務由可能被多次調用的函數對象(通常是閉包)定義。

在Go中,使用DB.Tx方法創建交易。閉包的參數*client.Tx實現了與DB類似的接口;在事務內部,您必須對此對象執行所有操作,而不是原始數據庫。如果你的函數返回一個錯誤,事務將被中止;否則它會提交。下面是前面的例子的事務版本(但請參閱下面的更高效的版本):

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

前面的例子等待「」寫起了「B」寫入前完成,然後等待在提交事務之前「b」寫入完成。通過在事務中使用批處理可以使這更高效。 Tx.B是批處理對象,就像DB.B一樣。在交易中,您可以使用Tx.RunTx.Commit運行批次。當且僅當批處理中的所有其他操作成功時,Tx.Commit纔會提交事務,並且比在閉包返回時讓事務自動提交更高效。這是一個很好的做法,總是在事務的批處理由Tx.Commit執行最後一個操作:

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

你應該標記爲答案您的回覆,這將是非常有幫助 –

相關問題