当有两个或多个进程同时请求它时,数据库如何决定它应该给哪个进程锁定?
How does a database decide which process it should give the lock to, when there's two or more processes requesting for it at the exact same time?
我知道数据库总是允许第一个查询它的进程锁定 row/table。但是,当数据库同时从多个进程接收到完全相同的查询时会发生什么?它是否随机决定首先将锁授予哪个进程?
举个例子,两个顾客要求买一个汉堡,而数据库只有 1 个汉堡。他们的查询在同一时刻到达服务器。哪个倒霉的顾客会弄丢午餐?
注意:我主要使用 SQL 服务器。
从数据库软件的角度来看,没有 "same time." 这样的东西但是假设你有一个有两个网络接口的多处理器系统,两个请求最终得到处理相同的 CPU 时钟周期——不太可能(每秒有数十亿个周期)但并非完全不可能。
每个请求都会有一个线程。每个线程都需要获取一个数据库锁,该锁可能保存在内存中的某个地方。该锁将受到操作系统锁的保护,这将防止两个线程同时访问数据库锁。
操作系统锁,归根结底也取决于内存访问。为了访问内存,CPU 对其进行了锁定并将其副本传输到板载缓存中。在第一个 CPU 完成之前,另一个 CPU 将无法访问它。所以只有一个CPU才能写内存得到O/S锁才能得到数据库锁
如果由于某种巧合,两个 CPU 都在同一时间请求相同的内存段并且都尝试获取内存锁,这两个请求由 "bus arbitration," 解决,这可能工作几种方式。它可能最终取决于哪个 CPU 在物理上更接近总线,或者它可能取决于哪个 CPU 具有更高的设备 ID。
使用数据库的应用程序永远不必担心像这样的微不足道的细节。它由数据库平台、O/S、CPU 以及最终的物理硬件负责。
我知道数据库总是允许第一个查询它的进程锁定 row/table。但是,当数据库同时从多个进程接收到完全相同的查询时会发生什么?它是否随机决定首先将锁授予哪个进程?
举个例子,两个顾客要求买一个汉堡,而数据库只有 1 个汉堡。他们的查询在同一时刻到达服务器。哪个倒霉的顾客会弄丢午餐?
注意:我主要使用 SQL 服务器。
从数据库软件的角度来看,没有 "same time." 这样的东西但是假设你有一个有两个网络接口的多处理器系统,两个请求最终得到处理相同的 CPU 时钟周期——不太可能(每秒有数十亿个周期)但并非完全不可能。
每个请求都会有一个线程。每个线程都需要获取一个数据库锁,该锁可能保存在内存中的某个地方。该锁将受到操作系统锁的保护,这将防止两个线程同时访问数据库锁。
操作系统锁,归根结底也取决于内存访问。为了访问内存,CPU 对其进行了锁定并将其副本传输到板载缓存中。在第一个 CPU 完成之前,另一个 CPU 将无法访问它。所以只有一个CPU才能写内存得到O/S锁才能得到数据库锁
如果由于某种巧合,两个 CPU 都在同一时间请求相同的内存段并且都尝试获取内存锁,这两个请求由 "bus arbitration," 解决,这可能工作几种方式。它可能最终取决于哪个 CPU 在物理上更接近总线,或者它可能取决于哪个 CPU 具有更高的设备 ID。
使用数据库的应用程序永远不必担心像这样的微不足道的细节。它由数据库平台、O/S、CPU 以及最终的物理硬件负责。