簡體   English   中英

sqlite同時多次寫入

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM