假设我有6条记录,我将获取大小设置为2。
[Id] [Name]
11 A <-- 1st fetch, start from 1 position
21 B
31 C <-- 2nd fetch, start from 3 position
41 D
51 E <-- 3rd fetch, start from 5 position
61 F
如果第一个用户发出“SELECT * from tablex”,第二个用户发出“DELETE FROM tablex WHERE Id = 2.删除过程恰好在第一次提取和第二次提取之间发生。
首先获取(A)
[Id] [Name]
11 A <-- 1st fetch, start from 1
21 B
从(B)
删除后[Id] [Name]
11 A <-- 1st fetch, start from 1
31 C
41 D
51 E
61 F
现在(A)的第二次获取应该从3开始,但是删除导致记录的位置被改变。如果第二次获取从位置3开始,则将获取的记录为
[Id] [Name]
41 D <-- position 3
51 E
而不是
[Id] [Name]
31 C <-- 2nd fetch, start from 3 position
41 D
我不确定这个问题是否会发生。或者现代数据库是否足够智能来检测它?或者只是在数据检索过程中锁定表格?
答案 0 :(得分:2)
你问的是“PHANTOM READ”。大多数数据库使用锁来防止在事务中发生这种情况
某些数据库提供“READ COMMITTED”(或更低)隔离级别,在这种情况下可能会发生幻像读取。
答案 1 :(得分:1)
在MSSQL中不能出现这样的问题,因为在检索结果集时发生了锁定。 我不知道另一个RDBMS。
答案 2 :(得分:0)
发生的情况部分取决于两次交易中的隔离级别。
如果提取进程在可序列化隔离中运行,则DELETE操作将失败。如果提取过程在脏读(读取未提交)隔离时运行,那么几乎任何事情都是可能的,但很可能,它会读取未删除的记录。