database - 两个数据库之间的一致性
问题描述
我正在尝试将这两个功能一起执行或根本不执行。如果一个函数失败,那么另一个函数也不应该执行。
func SomeFunc() error {
//Write to DB1
if err1 != nil {
return err
}
}
func OtherFunc() error {
//Write to DB2
if err2 != nil {
return err
}
}
我正在尝试写入两个不同的数据库,并且写入应该在两者中发生或两者都不发生。
我尝试过 if err1 == nil 然后执行 Otherfunc() 但是 Otherfunc() 可能会失败。
然后我们可以回滚更改,例如 if err2!= nil 然后将 db1 更新回原来的状态。问题在于此更新操作也可能失败。
我认为这是一个滑坡。我希望这些操作一起发生或根本不发生。
谢谢你的帮助。
编辑:
我发现了这个问题,“最终一致性”对我来说很有意义。
这是我现在的实现:
func SomeFunc() error {
//Write to DB1
if err1 != nil {
return err
}
}
func OtherFunc() error {
//Write to DB2
if err2 != nil {
return err2
}
}
func RevertSomeFunc() {
//Revert back changes by SomeFunc
fmt.Println("operation failed.")
if err3 != nil {
time.Sleep(time.Second * 5) //retry every 5 sec
RevertSomeFunc()
}
}
func main() {
err1 := SomeFunc()
if err1 != nil {
fmt.Println("operation failed.")
return
}
err2 := OtherFunc()
if err2 != nil {
go RevertSomeFunc() // launch it off to a go-routine so that it doesnt block the code.
}
}
如果有一些改进,我可以对这个实现做出一些改进。请lmk。
解决方案
推荐阅读
- c++ - 在 C++ 中实现堆栈时出现“std::logic_error”
- docker - 未转发 tcp 服务的 Kubernetes haproxy 负载均衡器
- flutter - 在构建时从 index.html 中删除 base-href
- excel - 代表特定单元格值拆分行
- installation - 在 Windows 7 上安装 Microsoft OneDrive
- yugabyte-db - YugabyteDB YCQL 中的 TTL 和事务回滚
- azure - Azure Datafactory 的 ManagedVNet IR 的二头肌部署错误
- powershell - 对象事件中不返回脚本块异常
- android - 何时调用 SELinux.restorecon()?
- java - 如何收集 HTTP 请求