Java 如果在数据检索过程中删除记录,会发生什么情况?
假设我有6条记录,我将获取大小设置为2Java 如果在数据检索过程中删除记录,会发生什么情况?,java,sql,concurrency,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 f
[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。删除过程正好发生在第一次提取和第二次提取之间
先拿一个
[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
我不确定这个问题是否会发生。或者现代的数据库足够智能来检测它?或者只是在数据检索过程中锁定表?在MSSQL中不会出现这种问题,因为在检索结果集时会发生锁定。
我不知道另一个RDBMS会怎么样。在MSSQL中不可能是这样的问题,因为在检索结果集时会发生锁定。
我不知道另一个RDBMS会怎么样。发生什么在一定程度上取决于两个事务中有效的隔离级别
如果获取进程以可序列化隔离运行,则删除操作将失败。如果取数进程以脏读未提交隔离运行,那么几乎任何事情都是可能的,但最有可能的是,它将读取未删除的记录。发生的情况将部分取决于两个事务中有效的隔离级别 如果获取进程以可序列化隔离运行,则删除操作将失败。如果抓取进程以脏读未提交隔离运行,那么几乎任何事情都是可能的,但最有可能的是,它会读取未删除的记录。您所要求的就是所谓的。大多数数据库使用锁来防止事务中出现这种情况 有些数据库提供或降低了隔离级别,在这种情况下可能会发生幻象读取。您所要求的就是所谓的。大多数数据库使用锁来防止事务中出现这种情况
有些数据库提供了或更低的隔离级别,在这种情况下可能会发生幻象读取。我挖掘了DELECT关键字GOOD catch,akf:D我刚刚更正了它。请详细说明您使用的数据库和数据库访问api我将使用Oracle。然而,这个问题并不局限于Oracle,因为我经常处理mySQL、sybase。我挖掘DELECT关键字GOOD catch,akf:D我刚刚更正了它。请详细说明您使用的是什么数据库和数据库访问api我将使用Oracle。然而,这个问题并不局限于Oracle,因为我经常处理mySQL、sybase。啊,是的,Oracle使用行版本控制:不正确:只有可序列化的隔离级别提供了您所说的锁定级别。当您读取选择的数据时,记录将被共享的S锁锁定。在解除锁定之前,无法编辑或删除记录。如果你使用NOLOCK提示,就不会有锁。Alex_L,有大量证据证明你错了。就在我的脑海里,这是:两个亚历克斯的歪斜总数的情况:这里的任何答案都会因为取回而变得复杂。select是一次性执行的,还是客户端游标一次执行两行?啊,是的,Oracle使用行版本控制:不正确:只有可序列化的隔离级别提供您所说的锁定级别。读取select数据时,记录将由共享的S锁锁定。在解除锁定之前,无法编辑或删除记录。如果你使用NOLOCK提示,就不会有锁。Alex_L,有大量证据证明你错了。就在我的脑海里,这是:两个亚历克斯的歪斜总数的情况:这里的任何答案都会因为取回而变得复杂。选择是一次性执行,还是客户端游标一次执行两行?