【问题标题】:How can i find where roll back invoked?我如何找到调用回滚的位置?
【发布时间】:2019-09-06 06:02:52
【问题描述】:

现在,我使用 Amazon RDS、lambda、python 和 sqlalchemy。当我检查 amazon rds 性能洞察时,我发现调用了一些回滚。到目前为止调用了回滚。 但是当我在见解中执行其他查询时,没有错误。 如何找到调用回滚的位置?或者为什么调用回滚?

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

这是我的 rds 性能见解

【问题讨论】:

  • 你检查过RDS日志吗?

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


【解决方案1】:

回滚可以源自回滚事务以展开查询,也可以源自将连接返回到池。

您可以了解您的应用正在做什么的一种方法是通过事件系统挂钩这些回滚操作以启用一些跟踪。

您需要查看两个事件:

  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}')

【讨论】:

  • 你的帮助让我可以检查增加 pool_rollbacks 计数。现在,我发现如何控制 poll_rollback。谢谢!!!
猜你喜欢
  • 1970-01-01
  • 2012-04-19
  • 2012-06-15
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多