You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL RDS中简单SELECT持有锁的原因及风险咨询

嘿,这个问题我之前帮不少人排查过,咱们一步步理清楚:

为什么Lambda的SELECT语句会持有锁?

首先得明确:PostgreSQL里的普通SELECT确实会加共享锁(Share Lock),但正常情况下这种锁是临时的——查询一结束就会释放,根本不会长期持有。你看到30条SELECT挂着锁,核心原因大概率是事务没正常结束,连接一直处于事务状态。

看你贴的Lambda代码:

with pgsql.cursor() as cursor:
    cursor.execute(
        """ SELECT first_name, picture, username FROM accounts_user WHERE id = %s """,
        (author_user_id,),
    )
    row = cursor.fetchone()
    # use the row ..

pg8000和很多PostgreSQL驱动一样,默认是关闭自动提交的。这意味着,如果你没手动调用commit()或者rollback(),这个连接的事务会一直挂着——哪怕只是个SELECT查询,PostgreSQL也会保持共享锁直到事务结束。而Lambda是无状态的,如果每次调用都创建新连接却不收尾事务,锁就会越积越多。

这事儿需要担忧吗?

必须重视!这些长期挂着的共享锁会带来几个麻烦:

  • 阻塞写操作:Django里的UPDATE/INSERT需要排他锁,会被共享锁卡住,直接导致查询超时(就是你遇到的情况)
  • 连接泄漏:Lambda每次调用都留个闲置连接,RDS的连接数很快就会被占满,后续新请求连不上数据库
  • 性能损耗:PostgreSQL要维护这些闲置事务和锁,会额外消耗资源
怎么解决?

给你几个立竿见影的方案:

  1. 显式结束事务
    不管是SELECT还是其他操作,查询结束后手动提交或回滚事务,强制结束连接的事务状态:
with pgsql.cursor() as cursor:
    cursor.execute(
        """ SELECT first_name, picture, username FROM accounts_user WHERE id = %s """,
        (author_user_id,),
    )
    row = cursor.fetchone()
    # 处理数据逻辑
pgsql.commit()  # SELECT用commit/rollback都行,核心是结束事务
  1. 开启自动提交
    创建连接时直接打开autocommit,让每个查询自动结束事务,锁会立刻释放:
import pg8000

pgsql = pg8000.connect(
    user="你的数据库用户名",
    password="你的数据库密码",
    host="你的RDS地址",
    database="你的数据库名",
    autocommit=True  # 关键参数,开启自动提交
)
  1. 确保连接正确关闭
    Lambda函数执行完后,一定要关闭连接,避免闲置连接占用资源:
pgsql = None
try:
    pgsql = pg8000.connect(...)
    with pgsql.cursor() as cursor:
        # 查询逻辑
    pgsql.commit()
finally:
    if pgsql is not None:
        pgsql.close()
  1. 用连接池优化(进阶)
    Lambda的短生命周期很容易导致连接爆炸,建议在RDS前面加个pgBouncer做连接池,统一管理数据库连接数,避免大量闲置连接占用资源。
验证方法

你可以跑个SQL看看这些连接的状态,确认是不是事务没结束:

SELECT pid, client_addr, query, state, xact_start 
FROM pg_stat_activity 
WHERE query LIKE '%accounts_user%';

如果结果里的state是idle in transaction,那就是咱们说的事务挂住的问题,按上面的方案改完就会好。

内容的提问来源于stack exchange,提问作者EralpB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:30:42