在 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.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"))
)
【讨论】:
你应该将你的回复标记为答案,这会很有帮助以上是关于在 CockroachDB 中,批处理和事务如何交互?的主要内容,如果未能解决你的问题,请参考以下文章
使用gRPC, NATS, CockroachDB构建EventSourcing/CQRS的微服务
如何在 Docker 容器内的 CockroachDB 中运行 SQL 脚本?