首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >数据库锁和web服务器如何针对数据库会话进行协作?

数据库锁和web服务器如何针对数据库会话进行协作?
EN

Stack Overflow用户
提问于 2018-10-11 15:24:33
回答 1查看 170关注 0票数 1

这个问题的范围很广,例如web服务器、数据库服务器、php应用程序等等,因此我怀疑它是否属于stackoverflow,但是由于这个问题将帮助我们如何编写应用程序代码,我决定在这里提问。

我对数据库会话和web服务器如何协同工作感到困惑。如果我是对的,当为客户端建立连接时,将只为该连接创建一个会话,并且该会话将一直持续到连接断开或由于长时间不活动而重新连接。

现在,如果我们考虑一个web服务器,特别是Apache2.4,运行PHP7.2应用程序(在虚拟主机中),数据库由MariaDB 10.3.10支持(如果这很重要的话),我假设以下情况(如果我错了,请纠正我):

  • 对于每个web应用程序,现在我们使用Laravel,当第一个查询命中它所服务的URL时,只会建立一个数据库连接。
  • 随后,它将只有一个数据库会话。这意味着,如果应用程序连续接收web请求24x7,连接也将保持活动状态,只有当我们重新启动mysqld或httpd时,连接才会断开,这可能在几个月内都不会发生。
  • 由于应用程序的所有用户都使用相同的Apache服务器和Laravel应用程序文件(我假设我可以调用应用程序实例),所有20个用户都将通过相同的数据库连接和数据库会话得到服务。

如果上面提到的所有用例都是正确的,那么数据库锁定的概念似乎非常令人困惑。假设我们将发出一个排它锁,例如lock tables t1 write;,它将阻塞其他会话的读写,以避免并发会话的脏读写操作。然而,由于所有20个用户同时使用相同的会话和连接,我们将无法从数据库锁定机制中获得所需的并发安全性。

问题:

  1. 数据库锁定和显式独占锁定在show status wherevariable_name= 'Threads_connected'?方面是如何工作的? Laravel应用程序收到的每个web请求都会创建新的连接和会话,还是只重用了一个连接和会话?
  2. 每个数据库连接是否一次只有一个会话?
  3. 此命令是否会显示当前活动的会话或连接Laravel如果它显示当前活动的连接,我们如何获取当前活动的数据库会话?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-11 16:39:04

在这种情况下,Apache与会话(主要)没有任何关系。数据库连接和会话是由php自己处理的。

除非您启用了连接池,否则不会重用数据库会话,每个请求都将打开自己的连接,并在结束时关闭它。

启用连接池后,为请求提供服务的线程将请求从池到进程管理器的连接(无论是fpm还是mod_php),并且它将从池返回一个可用的连接,但仍然会有至少与并发请求一样多的会话(除非达到任何max_限制)。general reference包含更多细节,但作为一个亮点:

持久连接不能让你在同一条链路上打开‘用户会话’,它们不能让你高效地建立一个事务,它们也不能做很多其他的事情。事实上,为了非常清楚这个主题,持久连接不会为您提供任何非持久兄弟不能提供的功能。

即使有一个可用的连接池,管理器也必须在将连接返回给客户端之前运行一些清理操作。其中一个操作是表解锁。

有关更多信息,请参阅mysqli扩展的connections referencepersistent connections reference

但是,您正在描述的多个客户端会话共享一个连接的操作模式是可能的(并且是实验性的),并且具有更多的缺点。它被称为session multiplexing

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52754521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档