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

时间:2017-06-18 13:16:32

标签: database oracle web transactions shopping-cart

在网上商店场景中,例如用户继续按下"购买"在他的购物车上,如果他关闭浏览器窗口或标签,会发生什么?

是数据库事务,例如更新有问题的产品数量或响应中触发的数据库触发器并记录事务的详细信息,回滚或继续完成?

换句话说,是一个"系统"能够确定用户是自愿地还是意外地关闭了他的浏览器,例如电力丢失或互联网连接断电,并在响应中终止或取消他的交易?

在现实环境中,事情如何运作?

1 个答案:

答案 0 :(得分:2)

在这种情况下可以观察到的行为不仅取决于数据库,还取决于Web应用程序及其支持服务的体系结构。

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

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

假装我们没有网络应用程序,只需通过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; 

请注意否#34; 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应用程序对其数据库连接的作用。

有了这些额外的部分,答案取决于应用程序架构和设计(而不是数据库)。通常,如果用户已经发送了他们的请求以将某些东西放入购物车(或完成订单),然后在收到回复之前意外断开连接,那么他们的请求将由服务器完成,但他们只是赢了。在那里得到" ok"回复。

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

许多应用程序开发人员(和Web框架)内置措施,以帮助客户清楚地了解他们的请求状态(例如,弹出窗口阻止选项卡或浏览器退出"您确定要吗?失去一个不完整的订单?"等等)。或者将内置监视器来回滚"已经在购物车中但一段时间后没有实际购买的东西,或者会发送电子邮件以确认购买是否实际完成(如果在点击&#34之后电源熄灭;购买"等)。等等,这取决于应用程序开发人员的决定。

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