flask-sqlalchemy with_for_update 互斥锁

0 评论
/ /
0 阅读
/
781 字
10 2021-09

业务中有个需求,就是可能会遇到并发读取某一行数据,然后修改这行数据,这时候就涉及到并发的锁了

比如:

address表有个user_id=3的字段的status如果为0则要update,为1则不需要,如果没有锁,当两个session同时访问到user_id为3的字段时,此时status都为0,那么两个session都会对数据库做一次update,这等于update了两次,那么怎么避免这种情况呢?就要用到with_for_update()方法了:

下面是session1的代码

session1:
 
addr = Address.query.filter_by(user_id=3).with_for_update().first
if addr.status == 0:
    addr.status = 1
db.session.commit()
下面是session2的代码:

session2:
 
addr = Address.query.filter_by(user_id=3).with_for_update().first
if addr.status == 0:
    addr.status = 1
db.session.commit()
那么当session1抢先拿到锁的时候,在执行到最后的commit之前,session2都会卡住,当session1释放锁,session2拿到锁之后,status已经改为1了.