昨天我正在处理一些需要“选择...更新”概念的sqlalchemy东西以避免竞争条件。在查询中添加.with_lockmode('update')
可以对InnoDB和Postgres进行处理,但对于sqlite,我最终不得不潜入
if session.bind.name == 'sqlite':
session.execute('begin immediate transaction')
在进行选择之前。
这似乎现在有效,但感觉就像作弊。有更好的方法吗?
答案 0 :(得分:7)
SELECT ... FOR UPDATE OF ...不受支持。这是可以理解的 考虑到SQLite的机制,因为行锁定是多余的 因为整个数据库在更新任何位时都被锁定。然而, 如果SQLite的未来版本支持SQL,那将会很好 可互换性的原因,如果没有别的。唯一的功能 要求是确保在数据库上放置“RESERVED”锁定 还没有。
摘录自 http://sqlite.org/cvstrac/wiki?p=UnsupportedSql
我认为你必须同步对整个数据库的访问。正常的同步机制也应该适用于文件锁,进程同步等