2015-06-03 19 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

你应该标记为答案您的回复,这将是非常有帮助 –

相关问题