当前位置: 代码迷 >> 综合 >> flask-sqlalchemy with_for_update 互斥锁
  详细解决方案

flask-sqlalchemy with_for_update 互斥锁

热度:93   发布时间:2023-10-17 22:06:06.0

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

比如:

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了.