您好,我認為這不是這個問題的正確位置,但我不知道該問哪里。我想使用相同的 SQLAlchemy 資料庫為該網站創建一個網站和一個 api 將同時獨立運行它們是安全的,或者這是否會導致同時發生的兩個寫入損壞。
uj5u.com熱心網友回復:
SQLA是SQL 的 Python 包裝器。它不是它自己的資料庫。如果您正在運行您的網站(也許是flask?)并從同一個腳本管理您的 api,您可以簡單地對您的 SQLA實體使用相同的參考。意思是,當您使用 SQLA 連接到資料庫并保存到變數時,真正發生的是它將連接保存到變數,并且您不斷參考該變數,而不是每次創建新連接的效率更低的方法時間。所以當你說
使用相同的 SQLAlchemy 資料庫
我相信您實際上是指實際的底層資料庫本身,而不是 SQLA 包裝器/連接到它。
如果您的網站和 API 沒有在同一個腳本中運行(或者即使它們運行在同一個腳本中,取決于您的 API 如何處理同時請求),您可能會遇到競爭條件,根據維基百科,它被定義為:
電子、軟體或其他系統的狀況,其中系統的實質性行為取決于其他不可控事件的順序或時間。當一個或多個可能的行為不受歡迎時,它就會成為一個錯誤。
這可能就是你提到的
這是否會導致同時發生兩個寫入的損壞。
為避免這種情況,當行程訪問檔案時,(取決于作業系統)執行檢查以查看該檔案是否存在“鎖定”,如果是,則作業系統拒絕打開該檔案。當行程訪問檔案時創建一個鎖(并且沒有其他行程持有該檔案的鎖),例如通過使用with open(filename):和在行程不再持有對檔案的打開參考時釋放(例如當python執行時留下with open(filename):縮進塊。)這可能是您在使用兩個同時連接到 SQLite 資料庫時可能遇到的真正問題。
但是,如果您使用的是 MySQL 之類的東西,您在其中連接到 SQL服務器行程,而不是檔案,因為無法直接訪問檔案,因此不會鎖定資料庫,您可能會遇到這種情況以下虛構場景中的令人討厭的競爭條件:
- Stack Overflow 查詢一個賬戶的聲譽,看看是否應該因為負面聲譽而被禁止。
- 就在同一時間,有人對該帳戶的回答投了贊成票,將其設定為低于帳戶禁止閾值的一分。
- 結果現在由這兩個任務的執行速度決定。
如果投票者的計算機很慢,并且在聲譽查詢完成之前 StackOverflow 沒有處理“投票”,則該帳戶將被禁止。但是,如果 Stack Overflow 的結束有一些滯后,并且在帳戶查詢完成之前進行了 upvote 處理,則該帳戶不會被禁止。
這個例子背后的關鍵概念是所有這些步驟都可以在幾分之一秒內發生,結果取決于兩端的執行速度。
為了解決資料損壞的問題,大多數資料庫都有一個適當的系統來正確排序資料庫的讀寫,但是,仍然可能出現語意問題,例如上面給出的示例。
uj5u.com熱心網友回復:
兩個應用程式可以使用同一個資料庫,因為 DB 是一個單獨的應用程式,每個 Flask 應用程式都會訪問它。
您所要求的可以完成,并且是許多大型 Web 應用程式使用的方法,特別是當 API 是在與主應用程式不同的框架中撰寫時。
由于 SQL 資料庫符合 ACID,因此它們有一個系統可以將多個讀/寫請求排入佇列,并以正確的順序執行它們,同時確保資料的可靠性。
但要問的一個問題是撰寫兩個單獨的應用程式是否有用。對于大多數僅限燒瓶的專案,最好的方法是使用藍圖將專案分開,具有“主”藍圖和“api”藍圖。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/365937.html
