[英]sqlite multiple writes at same time
我正在使用 sqlite 數據庫制作一個 python flask 應用程序,有沒有辦法為寫請求創建一個隊列,以便它可以順利運行,因為 SQLITE 不支持多個並發寫入或提交
這是我的連接字符串
engine = create_engine('sqlite:///IT_DataBase.db',
connect_args={'check_same_thread': False})
Base.metadata.bind = engine
DBSession = sessionmaker(bind=engine)
session = DBSession()
這是作為示例的提交代碼:
@app.route('/NewRequest', methods=['GET', 'POST'])
@login_required
def NewRequest():
connUser=session.query(User).filter(User.id==Session.get('user_id')).one()
if request.method == 'GET':
Types = session.query(Req_Type.id,Req_Type.Type_name)
Pr = session.query(Req_Priorities.id,Req_Priorities.Priority_name)
return render_template('NewRequest.html',conn=connUser ,name=current_user.name, items=Types,priorities=Pr)
else:
name= request.form['Name']
Description= request.form['Description']
Type = request.form.get('Type')
Priority = request.form.get('Priority')
newRequest = Requests(name=name, Record_Created=datetime.now().strftime("%Y-%m-%d %H:%M"), Description=Description, Assigned_To=None, Type_Name=str(Type), Priority_Name=str(Priority), Status_Name='Opened', User_ID=Session.get('user_id') )
session.add(newRequest)
flash('New Request With Name %s Successfully Created' % newRequest.name)
session.commit()
UserRequests= session.query(Requests).filter_by(User_ID=Session.get('user_id')).filter(Requests.Status_Name!='Solved').all()
return render_template('ReqData.html',conn=connUser , title='User Requests', rows=UserRequests)
我認為,如果我們不更改數據庫引擎,解決方案要么是將提交排隊,但我不知道如何或讓 Flask 在提交前等待隨機時間,但我認為這會使性能變差我該怎么辦
您需要序列化提交。 創建一個如下所示的鎖。
from threading import RLock
sql_lock = RLock()
像下面這樣包裝 session.add 和 session.commit。 lock.acquire()
將阻塞代碼,而另一個線程已獲取鎖,但尚未釋放鎖。 這確保了在任何時候都只有一個線程(或沒有線程)在acquire()
和release()
之間運行。
try:
sql_lock.acquire()
session.add(newRequest)
session.commit()
finally:
sql_lock.release()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.