单行 INSERT 是原子的(对于外部阅读器)吗?想象一下,它发生在一个有 1M 列的表上。
在执行单个 INSERT
语句(即“单行”类型)时,是否有可能同时发生的读取操作(可能使用“读取未提交”隔离级别)仅读取 的某些 值(列) ?
我对 MS SQL Server 的行为特别感兴趣,尽管我认为这对于所有主要供应商都是相似的。
链接到有关此事的官方文档的奖励积分。
最佳答案
是的,这可能发生。从某种意义上说,DML 是原子的,即写入要么全部保留,要么不保留,但并发读取可以以非常奇怪的方式观察部分写入。对于多行写入,这显然是可能的,但即使是单行写入对读者来说也不是原子的。
例如,您可能会发现一个非聚集索引的插入已完成,而另一个未完成。在罕见的、人为的情况下,这对于读者来说是可以察觉的。例如,如果你说:
select *
from T t1 with (index(1))
full outer join T t2 with (index(2)) on (someUniqueCondition)
您可以有效地获得两个非零索引之间的差异。实现此演示不需要索引提示。
关于sql - 单行 INSERT 是原子的吗?例如。在有 1M 列的表上?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30956391/