gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 22:30:24 25 4
gpt4 key购买 nike

例如,在一个webshop场景中,用户继续按购物车上的“buy”,如果他关闭了浏览器窗口或标签页,会发生什么情况?
例如,数据库事务是否会更新有问题的产品的数量,或者在响应时触发数据库触发器并记录事务的详细信息,是回滚还是继续完成?
换言之,一个“系统”是否能够确定用户自愿或意外地关闭了浏览器,比如断电或互联网连接断开,并据此终止或取消其交易?
在现实世界中,事情是如何运作的?

最佳答案

在这种情况下可以观察到的行为不仅取决于数据库,还取决于web应用程序的体系结构及其支持服务。
在评估这种情况时,重要的是要考虑多个部分——通常在使用浏览器中的web应用程序的购物者和后台数据库之间至少有一个(通常有两个或更多)层。
如果我们从最简单的情况开始(假装没有web应用程序,购物者直接连接到数据库),答案是肯定的。oracle的内部监视器和负责连接和断开连接的驱动程序非常善于检测客户机何时与未提交的更改断开连接并回滚。这是任何数据库服务器中的一个重要功能,因为许多客户端可能需要在短时间内更新相同的数据(例如在零售环境中购买项目),任何类型的数据丢失、无望、永久锁定都会严重破坏数据库提供并发数据访问的能力。我将在下面举一个例子来说明这一点,但是有大量的相关文档。Processes在概念手册中有很多很好的相关信息。
假装我们没有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应用程序中,有不同的设计和技术在发挥作用,以满足客户在不同时间失踪的不同需求,并提供可理解和满意的用户体验。

关于database - 当用户在事务完成之前关闭浏览器选项卡/窗口时,数据库 session 会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44615399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com