SQLAlchemy會話與事務控制:互斥鎖和共享鎖
阿新 • • 發佈:2018-11-15
關於sqlalchemy,可以細度這個網址:http://www.codexiu.cn/python/SQLAlchemy%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/73/531/
5.2. for update
SQLAlchemy 的 Query 支援 select ... for update / share
.
session.Query(User).with_for_update().first()
session.Query(User).with_for_update(read=True).first()
完整形式是:
with_for_update(read=False, nowait=False, of=None)
- read
-
是標識加互斥鎖還是共享鎖. 當為
True
時, 即for share
的語句, 是共享鎖. 多個事務可以獲取共享鎖, 互斥鎖只能一個事務獲取. 有"多個地方"都希望是"這段時間我獲取的資料不能被修改, 我也不會改", 那麼只能使用共享鎖. - nowait
- 其它事務碰到鎖, 是否不等待直接"報錯".
- of
- 指明上鎖的表, 如果不指明, 則查詢中涉及的所有表(行)都會加鎖.
SELECT ... FOR UPDATE 的用法。由於InnoDB 預設是Row-Level Lock,所以只有「明確」的指定主鍵或者其他索引的鍵,MySQL 才會執行Row lock ( 只鎖住被選取的資料) ,否則mysql 將會執行Table Lock (將整個資料表單給鎖住)。 只鎖住被選取的資料的好處是:多執行緒時,如果其他執行緒使用的是非鎖住的資料,則不會受影響,無需等待解鎖,更好的實現了併發。
參考:
http://www.codexiu.cn/python/SQLAlchemy%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/531/
https://www.jianshu.com/p/7e4de9ab942c