如果在数据检索过程中删除记录会发生什么?

时间:2009-07-13 00:26:37

标签: java sql concurrency

假设我有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

我不确定这个问题是否会发生。或者现代数据库是否足够智能来检测它?或者只是在数据检索过程中锁定表格?

3 个答案:

答案 0 :(得分:2)

你问的是“PHANTOM READ”。大多数数据库使用锁来防止在事务中发生这种情况

某些数据库提供“READ COMMITTED”(或更低)隔离级别,在这种情况下可能会发生幻像读取。

答案 1 :(得分:1)

在MSSQL中不能出现这样的问题,因为在检索结果集时发生了锁定。 我不知道另一个RDBMS。

答案 2 :(得分:0)

发生的情况部分取决于两次交易中的隔离级别。

如果提取进程在可序列化隔离中运行,则DELETE操作将失败。如果提取过程在脏读(读取未提交)隔离时运行,那么几乎任何事情都是可能的,但很可能,它会读取未删除的记录。