SQLAlchemy多執行緒下事務隔離機制詳解

2022-07-17 20:48:13 字數 1096 閱讀 6109

通過開啟多執行緒,併發查詢訂單詳情資訊,通過將不同訂單物件傳送給不同執行緒,執行完所需要的業務邏輯之後,對訂單物件的資料進行修改,然後執行 commit,查詢資料庫發現資料沒有更新,且後台日誌沒有任何的報錯

**錯誤**:**

from concurrent.futures import threadpoolexecutor

order.status = 'running'

db.session.commit()

def main():

orders = order.query.fitery_by(status='created').all()

with threadpoolexecutor(max_workers=10) as executor:

for order in orders:

通過日誌發現在主線程中查詢 orders 的時候,可以列印sql,但在新開啟的執行緒執行到 db.session.commit() 時,沒有對應sql列印。

**初步定位是執行緒傳遞 order 的問題,sqlalchemy 事務應該不允許跨執行緒。**

**在開啟的執行緒中,通過傳遞的訂單id獲取訂單物件**

from concurrent.futures import threadpoolexecutor

order = order.query.get(order_id)

order.status = 'running'

db.session.commit()

def main():

orders = order.query.fitery_by(status='created').all()

with threadpoolexecutor(max_workers=10) as executor:

for order in orders:

當生成 session 物件的時,這個物件並不是執行緒安全的,是乙個本地執行緒物件(thread local storage),因此當跨執行緒時,就不在此 session 範圍內了,從而導致物件無法提交。這樣也避免了多執行緒、多程序情況下,汙染其他執行緒或程序資料。

sqlalchemy 多執行緒 建立session

1 基於threding.local,推薦使用 from sqlalchemy.orm import sessionmaker from sqlalchemy import create engine from sqlalchemy.orm import scoped session from mo...

多執行緒那些事

其實在所有的軟體開發人員心裡應該有乙個開發準則,那就是錙銖必較。就是對於效能和速度的要求是我們不斷努力的方向。多執行緒就是為了實現我們對計算機硬體的最大化利用和並行處理而提出來的解決方案。當然對效能的要求就帶來了複雜的演算法處理方案。但是其他方面的效能優化也為我們的多執行緒程式設計引入了新的麻煩。首...

java多執行緒那些事

多執行緒那些事 0.多執行緒實現兩種方式 1 new thread public void run start 2 new thread new runnable start 推薦第二種,物件導向,1.synchronzied加誰身上鎖住誰,而且還是個悲觀鎖,但是確實能解決多執行緒同步問題,就是效率...