Loo*_*ast 4 database concurrency distributed-computing
这是我长久以来的困惑。如果多个进程同时将相同的记录写入同一个数据库表中,它们会发生冲突吗?
类似的问题,例如,一台主机不断向许多其他机器分发请求,例如向机器 A 的表中插入一条记录。不知何故,此操作在机器 A 上非常慢,并且主控制器将向机器 B 重新发送完全相同的请求。那么会发生什么呢?会有冲突吗?
Pav*_*nov 12
实际上有两个问题,但我会尽力回答主要问题。
首先,我们谈论什么样的数据库?如果它是像 Oracle、PostgreSQL、MSSQL 等这样的现代 RDBMS,那么它很可能具有按行锁机制,这意味着每个进程都可以同时插入/更新/删除行,只要它们不相互交叉。
一旦发生两个进程尝试更新同一行,一个进程(幸运的是第一个进程)将更新该行,而第二个进程将必须等待,直到第一个进程提交或回滚其事务。现在,除了第一个进程之外,此更新的行已被锁定,无法进行任何进程的任何更改。
如果第一个进程删除一行,也会发生同样的事情。在第一个进程提交或回滚事务之前,其他进程都无法插入具有相同唯一键的新行。
现在,当我们遇到两个进程插入具有相同唯一键的行时,事情变得更加有趣,如果让它们都完成,将会破坏关系模型。表中还没有行,因此无需锁定。但是,某个地方有一个索引可以提供唯一性。因此,进程实际上会尝试锁定索引的存储桶,而不是锁定行。首先的过程将会成功。现在,当第二个进程尝试插入行时,它将看到存储桶已锁定。与第一种情况一样,第二个进程必须等到存储桶被释放,然后检查是否可以插入并为自己锁定存储桶。
这实际上是一个非常肤浅和笼统的解释,但它给出了冲突解决机制如何工作的一个概念。实际的实现可能因数据库而异,并且要复杂得多。
| 归档时间: |
|
| 查看次数: |
5630 次 |
| 最近记录: |