0

我正在使用sqlalchemy-aurora-data-api连接到 aurora-postgresql-serverless,并将 SQLalchemy 作为 ORM。

在大多数情况下,这一直运行良好,但我在提交期间不断遇到来自 aurora_data_api(构建 sqlalchemy-aurora-data-api)的意外错误。

我试图通过捕获异常并重试来在应用程序逻辑中处理这个问题,但是,这仍然失败:


from aurora_data_api.exceptions import DatabaseError
from botocore.exceptions import ClientError

def handle_invalid_transaction_id(func):
    retries = 3

    @wraps(func)
    def inner(*args, **kwargs):
        for i in range(retries):
            try:
                return func(*args, **kwargs)
            except (DatabaseError, ClientError):
                if i != retries:
                    # The aim here is to try and force a new transaction 
                    # If an error occurs and retry
                    db.session.close()
                else:
                    raise

    return inner

然后在我的模型中做这样的事情:

class MyModel(db.Model):
    @classmethod
    @handle_invalid_transaction_id
    def create(cls, **kwargs):
        instance = cls(**kwargs)
        db.session.add(instance)
        db.session.commit()
        db.session.close()
        return kwargs

但是,我不断遇到不可预测的事务失败:

DatabaseError: (aurora_data_api.exceptions.DatabaseError) An error occurred (BadRequestException) when calling the ExecuteStatement operation: Transaction AXwQlogMJsPZgyUXCYFg9gUq4/I9FBEUy1zjMTzdZriEuBCF44s+wMX7+aAnyyJH/6arYcHxbCLW73WE8oRYsPMN17MOrqWfUdxkZRBrM/vBUfrP8FKv6Phfr6kK6o7/0mirCtRJUxDQAQPotaeP+hHj6/IOGUCaOnodt4M3015c0dAycuqhsy4= is not found [+26ms]

值得注意的是,这些不是特别长时间运行的事务,所以我认为我没有遇到 aurora-serverless 可能出现的事务过期问题,如此所述。

我的处理方法是否存在根本性的问题,或者是否有更好的方法来处理发生的交易失败?

4

1 回答 1

1

只是为了关闭它,以防它帮助其他人,发现问题出在光标中创建的事务

我无法回答原因,但我们注意到尽管数据已成功提交,但事务仍在过期。例如:

请求 1 - 创建一堆事务,写入数据,退出。请求 2 - 创建一堆事务,请求 1 的某些事务 id 失败,退出。

所以,是的,我认为问题不在于aurora-data-api,而是与 aurora-serverless 中的事务管理有关。最后,我们对 repo 进行了分叉并进行了重构,以便使用ExecuteStatment调用而不是使用事务来处理所有事情。到目前为止它运行良好(请注意,我们使用的是 SQLalchemy,因此无论如何事务都是在 ORM 级别处理的)。

于 2021-02-03T13:44:56.470 回答