6

什么时候应该使用批处理,什么时候应该使用事务?我可以批量嵌入交易吗?交易中的批次?

4

1 回答 1

8

批处理是为了提高效率而作为单个单元发送到服务器的操作的集合。它相当于从不同的线程发送相同的操作作为单独的请求。批处理中的请求可能会乱序执行,批处理中的某些操作可能会成功,而其他操作可能会失败。

在 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”写入之前等待“a”写入完成,然后在提交事务之前等待“b”写入完成。可以通过在事务中使用批处理来提高效率。Tx.B是一个批处理器对象,就像DB.B. 在事务中,您可以使用Tx.Run或运行批处理Tx.CommitTx.Commit当且仅当批处理中的所有其他操作都成功时才会提交事务,并且比在闭包返回时让事务自动提交更有效。始终将事务中的最后一个操作作为批处理执行是一个好习惯Tx.Commit

err := db.Tx(func(tx *client.Tx) error {
    return tx.Commit(tx.B.Put("a", "1").Put("b", "2"))
})
于 2015-06-03T20:51:19.310 回答