1. 程式人生 > >SQLAlchemy會話與事務控制:互斥鎖和共享鎖

SQLAlchemy會話與事務控制:互斥鎖和共享鎖

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