2011-04-27 21 views
13

昨天我正在使用一些需要「select ... for update」概念來避免競爭條件的sqlalchemy內容。添加.with_lockmode('update')到查詢工作在InnoDB和Postgres的一種享受,但對於SQLite的我最終做選擇之前,在如何在sqlalchemy中爲更新事務行爲強制執行sqlite選擇

if session.bind.name == 'sqlite': 
    session.execute('begin immediate transaction') 

潛行。

這似乎現在工作,但它感覺就像作弊。有一個更好的方法嗎?

+0

當連接池是除了'NullPool'之外的東西時,這是必要的嗎?或者換個說法,當dsn是'sqlite:///:memory:'? – SingleNegationElimination 2011-10-05 02:02:32

回答

7

SELECT ... FOR UPDATE OF ...不被支持。考慮到SQLite的機制,這是可以理解的 行鎖定是冗餘的 因爲整個數據庫在更新任何位時都被鎖定。但是,如果未來版本的SQLite支持SQL 互換性原因(如果沒有其他的話),它將會很好。要求 唯一的功能是確保如果 尚未存在,則將「已保留」鎖置於數據庫上。從 http://sqlite.org/cvstrac/wiki?p=UnsupportedSql

摘錄我認爲你必須訪問整個數據庫同步。正常的同步機制也應該在這裏應用文件鎖定,進​​程同步等。

+1

更多最新的鏈接:http://sqlite.org/isolation.html。請參閱摘要,第1點:SQLite中的事務是SERIALIZABLE。 – michauwilliam 2018-02-10 11:31:00