代码之家  ›  专栏  ›  技术社区  ›  janetsmith

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

  •  0
  • janetsmith  · 技术社区  · 17 年前

    [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,其中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
    

    [Id] [Name]
     41   D   <-- position 3
     51   E   
    

    而不是

    [Id] [Name]
     31   C   <-- 2nd fetch, start from 3 position
     41   D
    

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

    3 回复  |  直到 17 年前
        1
  •  2
  •   J-16 SDiZ    17 年前

    你所问的叫做“ PHANTOM READ “。大多数数据库使用锁来防止事务中出现这种情况。

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

        2
  •  1
  •   Alex_L    17 年前

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

        3
  •  0
  •   Jonathan Leffler    17 年前

    发生的情况将部分取决于两个事务中有效的隔离级别。

    如果获取进程以可序列化隔离运行,则删除操作将失败。如果抓取进程以脏读(未提交读取)隔离运行,那么几乎任何事情都是可能的,但最有可能的是,它将读取未删除的记录。