【发布时间】:2009-07-13 00:26:37
【问题描述】:
假设我有 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 开始,但删除导致记录的位置已更改。如果第 2 次提取从位置 3 开始,将提取的记录是
[Id] [Name]
41 D <-- position 3
51 E
而不是
[Id] [Name]
31 C <-- 2nd fetch, start from 3 position
41 D
我不确定这个问题是否会发生。还是现代数据库足够聪明,可以检测到它?或者只是在数据检索过程中锁定表?
【问题讨论】:
-
我挖掘 DELECT 关键字
-
很好,akf :D 我刚刚更正了。
-
请详细说明您使用的是什么数据库和数据库访问api
-
我将使用 Oracle。不过这个问题不限于Oracle,我也时不时处理mySQL、sybase。
标签: java sql concurrency