问题:由于用户多次点击按钮,导致增加数据时多次添加
解决:前端增加事件失效功能,后端增加锁机制
方法:
以下方法未试验过
1、代码锁(给代码的执行上锁,仅对单端口多进程有效,用户需等待前一请求处理结束)
import lock
lock.acquire()
你的业务逻辑
lock.release()
2、数据库表锁、行锁(能对多端口多进程有效)
行锁:
# 插入数据前先判断表中是否存在记录, 查询时加锁
if not session.query(User).filter_by(column=value).with_for_update().scalar():
obj = User(
column=value
)
db.session.add(obj)
# 提交事务, 锁解除
db.session.commit()
类似select ... for update
session.Query(User).with_for_update().first()
类似select ... for share
session.Query(User).with_for_update(read=True).first()
3、使用sqlalchemy的事务
try:
session.begin()
# 执行查询或更新操作,此时会自动管理行锁
session.commit()
except:
session.rollback()
raise
参考:
代码锁 https://www.cnblogs.com/shengulong/p/9961140.html
数据库表锁、行锁 https://www.lzskyline.com/archives/106/