關於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