关于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
本文深入探讨了SQLAlchemy框架中FOR UPDATE语句的使用,包括如何实现互斥锁和共享锁,以及其对数据库并发操作的影响。特别关注了InnoDB引擎下ROW LEVEL LOCK的应用,解释了如何通过明确的索引指定来实现更高效的行级锁定,从而提升多线程环境下的并发性能。
464





