数据库引擎如何处理并发插入?

时间:2012-01-17 03:58:30

标签: sql-server database sql-server-2008

我试图谷歌提出这个问题,但没有发现类似的问题所以我在这里问。这可能看起来像一个noob问题,但我真的不知道数据库如何处理并发插入。

假设有100个用户启动了插入查询。数据库是否同时插入多个记录(相同的秒,相同的纳秒等)或者一个接一个地插入每个记录?数据库在多线程环境中运行,因此自然答案将同时插入。

2 个答案:

答案 0 :(得分:5)

像SQL Server这样的数据库引擎(我假设您要求它,因为您将其标记)将使用某些版本的ARIES Write-Ahead Logging协议。由于这样的协议需要将日志写为顺序流,因此通常遵循同时触发的100个插入,即使在100 CPU服务器上也必须在访问日志时进行内部序列化。因此,正如您所建议的那样,在“纳秒”级别的并发性在理论上甚至是不可能的。该主题在几个地方有所描述,请参阅Write-Ahead Transaction LogTransaction RecoveryHow It Works: Bob Dorr's SQL Server I/O Presentation

但是,从实际的角度来看,您应该考虑交易和isolation levels

答案 1 :(得分:1)

假设用户在自己的事务中插入,引擎会单独提交每个事务。当提交进入表时,它们以任意方式排序,基于哪个线程获得更早的执行时间片。如果用户插入干扰表约束的数据(例如,他们将非唯一值插入到唯一列中),则一个随机用户的事务将成功,而所有其他用户的事务将失败。