当有两个或多个进程正好同时请求数据库时,数据库如何确定应将锁授予哪个进程?

我知道数据库将始终允许第一个进程查询它以对该行/表进行锁定。但是,当数据库在同一时间从多个进程收到完全相同的查询时,会发生什么情况?它会随机决定首先将锁定授予哪个进程吗?

一个例子是两个客户请求购买一个汉堡,而数据库中只有一个汉堡。他们的查询恰好在同一时间到达服务器。哪个不幸的顾客会失去午餐?

注意:我主要使用SQL Server。

xiaobiw9527 回答:当有两个或多个进程正好同时请求数据库时,数据库如何确定应将锁授予哪个进程?

从数据库软件的角度来看,没有“相同时间”之类的东西。但是,假设您有一个具有两个网络接口的多处理器系统,并且两个请求最终以完全相同的CPU时钟周期进行处理-不太可能(每秒数十亿个周期),但并非完全不可能。

每个请求都有一个线程。每个线程将需要获取一个数据库锁,该锁可能位于内存中的某个位置。该锁将受到操作系统锁的保护,这将防止两个线程同时访问数据库锁。

最终,操作系统锁定还取决于内存访问。为了访问内存,CPU在其上放置了一个锁,并将其副本传输到板载缓存中。在第一个CPU完成之前,另一个CPU将无法访问它。因此,只有一个CPU能够写入内存以获取O / S锁来获取数据库锁。

如果由于某些巧合,两个CPU都在完全相同的时间请求相同的内存段,并且都尝试获取内存锁,则可以通过“总线仲裁”解决这两个请求,这可以通过多种方式进行。最终可能取决于哪个CPU在物理上距离总线更近,或者取决于哪个CPU具有更高的设备ID。

使用数据库的应用程序将永远不必担心像这样的微小细节。数据库平台,操作系统,CPU和最终的物理硬件都可以解决这个问题。

本文链接:https://www.f2er.com/3155420.html

大家都在问