业务中有个需求,就是可能会遇到并发读取某一行数据,然后修改这行数据,这时候就涉及到并发的锁了
比如:
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了.