如何在sqlalchemy中强制执行sqlite select for update事务行为

时间:2011-04-27 06:11:25

标签: python sqlite sqlalchemy

昨天我正在处理一些需要“选择...更新”概念的sqlalchemy东西以避免竞争条件。在查询中添加.with_lockmode('update')可以对InnoDB和Postgres进行处理,但对于sqlite,我最终不得不潜入

if session.bind.name == 'sqlite':
    session.execute('begin immediate transaction')
在进行选择之前

这似乎现在有效,但感觉就像作弊。有更好的方法吗?

1 个答案:

答案 0 :(得分:7)

  

SELECT ... FOR UPDATE OF ...不受支持。这是可以理解的   考虑到SQLite的机制,因为行锁定是多余的   因为整个数据库在更新任何位时都被锁定。然而,   如果SQLite的未来版本支持SQL,那将会很好   可互换性的原因,如果没有别的。唯一的功能   要求是确保在数据库上放置“RESERVED”锁定   还没有。

摘录自 http://sqlite.org/cvstrac/wiki?p=UnsupportedSql

我认为你必须同步对整个数据库的访问。正常的同步机制也应该适用于文件锁,进程同步等