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

Posted

技术标签:

【中文标题】在 CockroachDB 中,批处理和事务如何交互?【英文标题】:In CockroachDB, how do batches and transactions interact? 【发布时间】:2015-08-18 06:35:33 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

在 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.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"))
)

【讨论】:

你应该将你的回复标记为答案,这会很有帮助

以上是关于在 CockroachDB 中,批处理和事务如何交互?的主要内容,如果未能解决你的问题,请参考以下文章

使用gRPC, NATS, CockroachDB构建EventSourcing/CQRS的微服务

如何在 Docker 容器内的 CockroachDB 中运行 SQL 脚本?

CockroachDB架构-SQL层

如何解决 CockroachDB 和 Spring-Boot 的密码问题

如何加快 CockroachDB 中的插入性能

如何更改 CockroachDB 的默认数据库?