簡體   English   中英

當用戶在事務完成之前關閉瀏覽器選項卡/窗口時,數據庫會話會發生什么情況?

[英]What happens to a database session when the user closes the browser tab/windows before the transaction is completed?

例如,在一個網店場景中,用戶繼續按下購物車上的“購買”,如果他關閉瀏覽器窗口或向下拖動會發生什么情況?

是例如更新有問題產品數量的數據庫交易,還是作為響應而觸發的數據庫觸發器並記錄交易的詳細信息,回滾還是繼續完成?

換句話說,一個“系統”是否能夠確定用戶是自願還是無意中關閉了瀏覽器,就像斷電或互聯網連接中斷了一樣,從而終止或取消了他的交易?

事物在現實環境中如何工作?

在這種情況下,人們可以觀察到的行為不僅取決於數據庫,還取決於Web應用程序及其支持服務的體系結構。

在評估這種情況時,重要的是要考慮多個方面-在使用瀏覽器中的Web應用程序的購物者和支持數據庫之間通常至少存在一層(通常是兩層或更多層)。

如果我們從最簡單的情況開始(假設沒有Web應用程序,並且購物者直接連接到數據庫),答案是肯定的 Oracle的內部監視器和負責連接和斷開連接的驅動程序非常擅長檢測客戶端何時通過未提交的更改斷開連接並回滾。 這是任何數據庫服務器中的重要功能,因為許多客戶端可能需要在短時間內更新相同的數據(例如在零售環境中購買商品),並且任何形式的丟失,無望的永久性鎖定都會嚴重破壞了數據庫提供並發數據訪問的能力。 我將在下面舉一個例子來說明這一點,但是有大量相關文檔。 過程中的概念手冊有很多很好的相關信息。

假裝我們沒有Web應用程序,僅通過sql plus等連接。我們可以看到這種檢測在起作用。

讓我們創建一個測試表:

CREATE TABLE PRODUCT(PRODUCT_ID NUMBER,QUANTITY_REMAINING NUMBER);

Table created.

並提供一些記錄:

INSERT INTO PRODUCT VALUES (1,100);
INSERT INTO PRODUCT VALUES (2,1);
COMMIT;
1 row created.
1 row created.
Commit complete.

現在,讓我們由不同的用戶啟動兩個會話。 這兩個會話都想購買項目1。 Session A首先到達那里。

Session A

UPDATE PRODUCT
SET QUANTITY_REMAINING = QUANTITY_REMAINING - 1
WHERE PRODUCT_ID = 1; 

1 row updated.

然后,在Session A意外退出之前, Session B還嘗試購買產品1。她必須等待會話A完成。

Session B

UPDATE PRODUCT
SET QUANTITY_REMAINING = QUANTITY_REMAINING - 1
WHERE PRODUCT_ID = 1; 

注意此處沒有“ 1 row updated. ”。
現在,我將遠程殺死Session A (在此示例中為pid 8771)。它沒有機會提交或回滾,或正常退出,斷開連接等。

% kill -9 8771 
zsh: killed     sqlplus /nolog

現在Session A已經消失,但是如果我們查看會話B,我們可以立即看到它能夠繼續進行:

1 row updated.

因此,是的,Oracle進程監視可以處理異常的客戶端斷開連接,就像正常的客戶端斷開連接並回滾一樣。

但這只是故事的一小部分...在典型的Web應用程序中,由Web容器管理的連接池中存在(至少一個)壽命很長的連接。 對於數據庫,所連接的客戶端是單個用戶還是龐大的Web應用程序都沒有關系,它可以處理意外的斷開連接。

但是在Web應用程序中,用戶無法控制Web應用程序的數據庫連接-用戶通過瀏覽器與Web應用程序進行交互,而瀏覽器可能進而對正在與數據庫進行通信的另一個服務應用程序進行額外的調用。 用戶在其瀏覽器中不知道正在更新什么數據或如何更新數據,只是他們想在購物車中放入一些東西。 他們無法控制Web應用程序如何處理其數據庫連接。

隨着這些額外功能的發揮,答案取決於應用程序體系結構和設計(而不是數據庫)。 通常,如果用戶發送了將商品放入購物車(或完成訂單)的請求,然后在收到響應之前意外斷開連接,那么服務器仍然會完成他們的請求,但是他們不會在那里以獲得“確定”的回復。

然后,應用程序開發人員(或Web框架)將決定如何處理可能無限期等待丟失的購物者的購物車(已成功保存到數據庫)中的購物車。

許多應用程序開發人員(和Web框架)的內置措施可幫助客戶清楚地了解其請求的狀態(例如,彈出窗口阻止選項卡或瀏覽器退出,並顯示“您確定要丟失不完整的訂單嗎?”。等)。 或將內置監視器以“回滾”購物車中已經過一段時間但尚未實際購買的東西,或者將發送電子郵件以確認購買實際完成的時間(如果點擊“購買”后電源消失了“)等。但這取決於應用程序開發人員。

總而言之,是的,Oracle數據庫可以在客戶端斷電等情況下檢測到不完整的事務,並且回滾就可以了。 借助Web應用程序,可以發揮不同的設計和技術來滿足不同時間丟失客戶的不同需求,並提供可理解和令人滿意的用戶體驗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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