当事务完成之前用户关闭浏览器选项卡/窗口时,数据库会话会发生什么情况?

问题描述:

在例如用户继续按“买”他的购物车的网上商店的情况下,会发生什么情况下,他关闭浏览器窗口或标签了吗?当事务完成之前用户关闭浏览器选项卡/窗口时,数据库会话会发生什么情况?

是数据库事务,对于例如更新响应打响了所涉产品的数量或数据库触发器并记录交易细节,回滚或者他们继续完成?

换句话说,是一个“系统”,能够确定用户是否愿意或意外地关闭了浏览器,如断电或互联网连接断开,终止或取消其交易?

如何做的事情在现实世界环境中工作?

行为人能在情况下观察这样不仅依赖的数据库,同时也对Web应用程序的体系结构和其支持服务(S)。

在评估这样的情况时,重要的是要考虑多个部分的使用 - 通常在浏览器中使用Web应用程序的购物者和支持数据库之间至少存在一个(通常是两个或更多)层。

如果我们从最简单的情况开始(假装没有web应用程序,购物者直接连接到数据库),答案是。 Oracle的内部监视器和负责连接和断开连接的驱动程序非常擅长检测客户端何时断开未提交的更改并回滚事务。这是在任何数据库服务器的一个重要特征,因为许多客户可能需要更新相同的数据(如零售机构购买物品)在很短的时间框架,以及对数据的任何形式的丢失,绝望,永久锁会严重破坏了数据库交付并发数据访问的能力。我将在下面举一个例子来说明这一点,但是有大量的相关文档。在概念手册中有Processes有很多很好的相关信息。

假装我们没有web应用程序,只是通过SQL连接加分,等等。我们可以看到这种检测在行动。

让我们创建一个测试表:

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还试图购买产品她必须等到一个会话完成。

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应用程序对数据库连接的操作。

有了这些额外的作品,答案取决于应用程序体系结构和设计(而不是数据库)。通常,如果用户发送请求将某些内容放入购物车(或完成订单),然后在得到响应之前意外断开连接,则它们的请求将由服务器完成,但它们不会在那里得到“ok”回应。

然后应用程序开发人员(或web框架)将决定如何处理购物车中的物品(已成功保存到数据库),这些物品可能会无限期地等待失踪的购物者。

许多应用程序开发人员(和Web框架)内置措施可以帮助客户清楚地了解他们的请求状态(例如弹出窗口阻止选项卡或浏览器退出“您确定要丢失不完整的订单?“等)。或者将内置显示器“回滚”购物车中的物品,但不会在一段时间后实际购买,或者发送电子邮件以确认购物实际完成的时间(如果点击“购买“)等等。但是,这取决于应用程序开发人员的决定。

总而言之,是的,Oracle数据库可以在客户端断电等情况下检测到不完整的事务并且回滚就好。借助Web应用程序,可以使用不同的设计和技术来满足客户在不同时间丢失的不同需求,并提供可理解和令人满意的用户体验。