我如何找到回滚调用的地方?

时间:2019-09-06 06:02:52

标签: python sql sqlalchemy aws-lambda amazon-rds

现在,我使用Amazon RDS,lambda,python和sqlalchemy。当我检查Amazon RDS性能洞察力时,我发现调用了一些回滚。到目前为止,回滚已被调用。 但是当我在洞察力中执行其他查询时,没有错误。 如何找到在何处调用回滚?还是为什么调用回滚?

  1. 我怀疑错误的查询。因此,我尝试发送与性能见解中发现查询相同的查询。但没有回滚。
  2. 我怀疑交通问题。因此,我尝试同时使用'for'和5终端发送许多关于(1000000)的查询。在我检查显示进程列表之后。但没有回滚。
  3. 我听说sqlalchemy.create_engine使用连接池,并且当连接关闭时,sqlalchemy调用了回滚。但我不知道该如何解决这个问题,而这个问题就是该问题的解决方案。

这是我的rds性能见解CodeSandbox

1 个答案:

答案 0 :(得分:2)

回滚可以源自回滚事务以取消查询,也可以基于将连接返回到池之后。

您可以了解应用程序运行情况的一种方法是通过事件系统加入这些回滚操作以启用一些跟踪。

您需要查看两个事件:

  1. ConnectionEvents.rollback
  

由交易启动的拦截rollback()事件。

  1. PoolEvents.reset
  

在池连接发生“重置”操作之前调用。

您可以在这些事件上设置侦听器,以增加一些计数器,或执行一些特定于记录回滚数量的日志记录。这样您就可以了解事务回滚与池回滚的相对权重。

例如使用一些粗略的全局计数器,但是您可以添加所需的任何逻辑:

import logging
from sqlalchemy import event

POOL_ROLLBACKS = 0
TXN_ROLLBACKS = 0

@event.listens_for(YourEngine, 'reset')
def receive_reset(dbapi_connection, connection_record):
    POOL_ROLLBACKS += 1
    logging.debug(f"Pool rollback count: {POOL_ROLLBACKS}")

@event.listens_for(YourEngine, 'rollback')
def receive_rollback(conn):
    # track a transaction based rollback
    TXN_ROLLBACKS += 1
    logging.debug(f'Transaction rollback count {TXN_ROLLBACKS}')