在CockroachDB中,批处理和事务如何交互?

Ben*_*ell 6 go cockroachdb

我何时应该使用批次,何时应该使用交易?我可以批量嵌入交易吗?交易中的批次?

Ben*_*ell 8

甲批次是操作的集合被发送到服务器,作为效率的单个单元.它相当于从不同的线程发送与单个请求相同的操作.批处理中的请求可能不按顺序执行,并且批处理中的某些操作可能成功而其他操作失败.

在Go中,使用batcher对象创建批处理DB.B,并且必须将其传递给DB.Run().例如:

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

相当于:

_, err1 := db.Put("a", "1")
_, err2 := db.Put("b", "2")
Run Code Online (Sandbox Code Playgroud)

一个交易定义操作的一致和原子序列.事务保证了系统中所有其他操作的一致性:除非提交事务,否则无法看到事务的结果.由于可能需要重试事务,因此事务由函数对象(通常是闭包)定义,可以多次调用.

在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")
})
Run Code Online (Sandbox Code Playgroud)

前一个示例在开始"b"写入之前等待"a"写入完成,然后在提交事务之前等待"b"写入完成.通过在事务中使用批处理,可以提高效率.Tx.B是一个批处理对象,就像DB.B.在事务中,您可以使用Tx.Run或运行批处理Tx.Commit.Tx.Commit当且仅当批处理中的所有其他操作都成功时才会提交事务,并且比关闭返回时让事务自动提交更有效.最好始终通过以下方式使事务中的最后一个操作成批执行Tx.Commit:

err := db.Tx(func(tx *client.Tx) error {
    return tx.Commit(tx.B.Put("a", "1").Put("b", "2"))
})
Run Code Online (Sandbox Code Playgroud)