首页 > 解决方案 > 如何使用重试事务解决由并行 goroutine 引起的数据库死锁问题?

问题描述

我们正在努力使用 Go 建立一个交易所。现在的系统中有以下组件:

以下是系统的工作原理:

    // Update accounts, orders, trades with max retry of 5
    for i := 0; i < 5; i++ {
        err = nil
        time.Sleep(10 * time.Second)
        if err = manager.saveEngineResponse(newEngineResponse, accountUpdatesToDoRef, &updatedOrders); err == nil {
            break
        }
        logger.Debug("Error saving engine response", err)
    }
    if err != nil {
        logger.Fatal(err)
        return
    }

错误:错误 1213:尝试获取锁时发现死锁;尝试重启事务

我参考了链接:How to Avoid mysql 'Deadlock found when trying to get lock; 尝试重新启动事务' ,它指出通过保持特定顺序的操作可以避免死锁。在上述情况下,所有交易都将首先更新账户,然后下单,如果有的话再交易。所以在不同的事务中操作的顺序是一致的

标签: mysqlgoparallel-processinggoroutinedatabase-deadlocks

解决方案


推荐阅读