当用户在交易完成前关闭浏览器 tab/windows 时,数据库会话会发生什么情况?
What happens to a database session when the user closes the browser tab/windows before the transaction is completed?
在网店场景中,例如用户继续在他的购物车上按 "buy",如果他关闭浏览器 window 或向下切换标签会发生什么?
例如更新相关产品数量的数据库事务或作为响应触发的数据库触发器并记录事务的详细信息,回滚还是它们继续完成?
换句话说,是 "system" 能够确定用户自愿或无意关闭了浏览器,例如断电或互联网连接中断,并终止或取消他的交易回应?
事物在现实世界环境中是如何运作的?
在这种情况下可以观察到的行为不仅取决于数据库,还取决于 Web 应用程序及其支持服务的体系结构。
在评估这种情况时,重要的是要考虑多个因素——通常在浏览器中使用 Web 应用程序的购物者与后台之间至少有一层(通常是两层或更多层)数据库。
如果我们从最简单的情况开始,(假设没有网络应用程序并且购物者直接连接到数据库)答案是 是。 Oracle 的内部监视器和负责连接和断开连接的驱动程序非常擅长检测客户端何时因未提交的更改而断开连接并回滚。这是任何数据库服务器中的一个重要功能,因为许多客户端可能需要在短时间内更新相同的数据(例如在零售环境中购买商品),并且任何类型的丢失、无望的、永久的数据锁定都会严重破坏数据库提供并发数据访问的能力。我将在下面举一个例子来说明这一点,但是有大量相关文档。 Processes 在概念手册中有很多很好的相关信息。
假装我们没有网络应用程序,只是通过 sql plus 等连接。我们可以看到这种检测的实际效果。
让我们创建一个测试 table:
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进程监控可以像处理正常客户端断开一样处理异常客户端断开并回滚ok。
但这只是故事的一小部分...在典型的 Web 应用程序中,在由 Web 容器管理的连接池中存在(至少一个)非常长寿命的连接。对于数据库来说,无论连接的客户端是个人用户还是大型网络应用程序,它都同样处理意外断开连接。
但在 Web 应用程序中,用户无法控制 Web 应用程序的数据库连接——用户通过他们的浏览器与 Web 应用程序进行交互,而浏览器又可能会额外调用另一个正在与其通信的服务应用程序数据库。浏览器中的用户不知道正在更新什么数据或如何更新,只是他们想将某些东西放入购物车。他们无法控制 Web 应用程序对其数据库连接执行的操作。
有了这些额外的部分,答案取决于应用程序架构和设计(而不是数据库)。通常,如果用户已发送他们的请求以将某些东西放入购物车(或完成订单),然后在收到响应之前意外断开连接,他们的请求仍然会由服务器完成,但他们不会在那里获得 "ok" 响应。
然后,应用程序开发人员(或网络框架)将决定如何处理可能无限期等待失踪购物者的购物车商品(已成功保存到数据库中)。
许多应用程序开发人员(和网络框架)内置措施来帮助客户清楚地了解他们的请求状态(例如弹出窗口阻止选项卡或浏览器退出 "Are you sure you want to lose an incomplete order?" 等).或者将内置监视器以监控 "rollback" 已在购物车中但一段时间后未实际购买的东西,或者将发送电子邮件以确认购买实际完成的时间(如果点击后电源就断电了) "buy") 等。但这由应用程序开发人员决定。
总而言之,是的,Oracle 数据库可以在客户端断电等情况下检测到不完整的事务,然后回滚就好了。对于 Web 应用程序,有不同的设计和技术在发挥作用,以满足不同时间失踪客户的不同需求,并提供易于理解和令人满意的用户体验。
在网店场景中,例如用户继续在他的购物车上按 "buy",如果他关闭浏览器 window 或向下切换标签会发生什么?
例如更新相关产品数量的数据库事务或作为响应触发的数据库触发器并记录事务的详细信息,回滚还是它们继续完成?
换句话说,是 "system" 能够确定用户自愿或无意关闭了浏览器,例如断电或互联网连接中断,并终止或取消他的交易回应?
事物在现实世界环境中是如何运作的?
在这种情况下可以观察到的行为不仅取决于数据库,还取决于 Web 应用程序及其支持服务的体系结构。
在评估这种情况时,重要的是要考虑多个因素——通常在浏览器中使用 Web 应用程序的购物者与后台之间至少有一层(通常是两层或更多层)数据库。
如果我们从最简单的情况开始,(假设没有网络应用程序并且购物者直接连接到数据库)答案是 是。 Oracle 的内部监视器和负责连接和断开连接的驱动程序非常擅长检测客户端何时因未提交的更改而断开连接并回滚。这是任何数据库服务器中的一个重要功能,因为许多客户端可能需要在短时间内更新相同的数据(例如在零售环境中购买商品),并且任何类型的丢失、无望的、永久的数据锁定都会严重破坏数据库提供并发数据访问的能力。我将在下面举一个例子来说明这一点,但是有大量相关文档。 Processes 在概念手册中有很多很好的相关信息。
假装我们没有网络应用程序,只是通过 sql plus 等连接。我们可以看到这种检测的实际效果。
让我们创建一个测试 table:
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进程监控可以像处理正常客户端断开一样处理异常客户端断开并回滚ok。
但这只是故事的一小部分...在典型的 Web 应用程序中,在由 Web 容器管理的连接池中存在(至少一个)非常长寿命的连接。对于数据库来说,无论连接的客户端是个人用户还是大型网络应用程序,它都同样处理意外断开连接。
但在 Web 应用程序中,用户无法控制 Web 应用程序的数据库连接——用户通过他们的浏览器与 Web 应用程序进行交互,而浏览器又可能会额外调用另一个正在与其通信的服务应用程序数据库。浏览器中的用户不知道正在更新什么数据或如何更新,只是他们想将某些东西放入购物车。他们无法控制 Web 应用程序对其数据库连接执行的操作。
有了这些额外的部分,答案取决于应用程序架构和设计(而不是数据库)。通常,如果用户已发送他们的请求以将某些东西放入购物车(或完成订单),然后在收到响应之前意外断开连接,他们的请求仍然会由服务器完成,但他们不会在那里获得 "ok" 响应。
然后,应用程序开发人员(或网络框架)将决定如何处理可能无限期等待失踪购物者的购物车商品(已成功保存到数据库中)。
许多应用程序开发人员(和网络框架)内置措施来帮助客户清楚地了解他们的请求状态(例如弹出窗口阻止选项卡或浏览器退出 "Are you sure you want to lose an incomplete order?" 等).或者将内置监视器以监控 "rollback" 已在购物车中但一段时间后未实际购买的东西,或者将发送电子邮件以确认购买实际完成的时间(如果点击后电源就断电了) "buy") 等。但这由应用程序开发人员决定。
总而言之,是的,Oracle 数据库可以在客户端断电等情况下检测到不完整的事务,然后回滚就好了。对于 Web 应用程序,有不同的设计和技术在发挥作用,以满足不同时间失踪客户的不同需求,并提供易于理解和令人满意的用户体验。