Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 具有读取未提交隔离级别的查询是否会导致其访问的表被锁定?_Sql_Batch Processing_Isolation Level_Database Locking_Read Uncommitted - Fatal编程技术网

Sql 具有读取未提交隔离级别的查询是否会导致其访问的表被锁定?

Sql 具有读取未提交隔离级别的查询是否会导致其访问的表被锁定?,sql,batch-processing,isolation-level,database-locking,read-uncommitted,Sql,Batch Processing,Isolation Level,Database Locking,Read Uncommitted,我的应用程序需要批处理10M行,这是连接表的复杂SQL查询的结果。 我计划迭代一个结果集,每次迭代读取100个结果集。 要在繁忙的OLTP生产数据库上运行此命令并避免锁定,我想我将使用读取未提交隔离级别进行查询。 这会不会让查询避开任何数据库写入?避免任何行/表锁? 我主要关心的是我的查询阻塞了任何其他的DB活动,我不太关心其他方面 旁注: 1.我将读取历史数据,因此不太可能遇到未提交的数据。如果我去的话没关系。 2.迭代过程可能需要几个小时。在此过程中,数据库连接将保持打开状态。 3.我最多有

我的应用程序需要批处理10M行,这是连接表的复杂SQL查询的结果。
我计划迭代一个结果集,每次迭代读取100个结果集。
要在繁忙的OLTP生产数据库上运行此命令并避免锁定,我想我将使用读取未提交隔离级别进行查询。
这会不会让查询避开任何数据库写入?避免任何行/表锁?

我主要关心的是我的查询阻塞了任何其他的DB活动,我不太关心其他方面

旁注:
1.我将读取历史数据,因此不太可能遇到未提交的数据。如果我去的话没关系。
2.迭代过程可能需要几个小时。在此过程中,数据库连接将保持打开状态。
3.我最多有两个这样的并发批处理实例。
4.我能忍受重复的争吵。(按读取未提交的产品)。
5.DB2是目标数据库,但我想要一个适合其他DBs供应商的解决方案。

6.快照隔离级别是否有助于清除服务器内存?

在sql server事务隔离级别中,读取未提交会导致表上没有锁。

您在读取时确实遇到过任何真正的锁吗

就我而言,SQL标准中存在ReadUncommitted的唯一原因是允许非锁定读取。所以我不知道DB2,但我盲目地打赌它不会在读未限制模式下的读期间锁定数据。然而,大多数现代RDBMS系统在读取(*)期间根本不锁定数据。因此,ReadUncommitted要么不可用(例如在Oracle中),要么以静默方式升级为ReadCommitted(PostgreSQL)

如果您可以自由选择引擎,可以检查DB2事务隔离级别处理,也可以选择Oracle/PostgreSQL/other


(*)更准确地说,它们不会以独占方式锁定数据。一些共享锁可以放置在查询的表上,因此在读取过程中没有DDL更改它们。

我的答案适用于SQL Server

读取提交在每一行读取后释放锁(大约)。锁定可能不是你的问题

我建议您使用更安全的
阅读提交的
。更好的方法是使用快照隔离。这消除了许多锁定问题。也有缺点,所以你最好读一读

我主要关心的是我的查询是否会阻止任何其他DB活动

快照隔离可以消除只读事务的所有锁定问题。无论哪种方式都没有阻塞,数据完全一致。请注意,长时间运行的事务可能会导致TempDB充满快照版本

在此过程中,DB连接将保持打开状态

这是一个问题,因为网络故障、应用程序部署或镜像故障切换会杀死批处理进程


请注意,readuncommitted可能会导致查询偶尔彻底失败。您需要重试逻辑或容忍失败的作业。

您使用的是哪种DBMS?赛贝斯?SQL Server?MySQL?DB2(主)、MSSQL、Oracle。Oracle从不允许您读取未提交的数据,并且不需要
读取未提交的
,因为在Oracle(以及自9.7以来的DB2)中,读卡器从不阻止读卡器。@a_horse_,with_no_name这不是一个太笼统的说法吗?这不取决于读者和作者的隔离程度吗?不,这不是“太”一般的。这就是甲骨文的工作原理。实际上,其他几个DBMS也是这样工作的:Postgres、Firebird、MySQL/InnoDB——如果配置正确,甚至SQL Server。它基于一种称为MVCC的架构:用READ_COMMITTED可以阻止我的查询吗?我会阻止什么?快照隔离-在创建已提交读取的快照时,不会锁定其他事务吗?我猜这也不是所有DB供应商都支持的?失败-我的批处理知道如何从上次离开的位置恢复-所以这不是问题。不知道“偶尔彻底失败”,为什么?使用SQL Server提交的某些DB edge案例?读取通常不会阻止其他事务,因为所有S锁都非常短暂。巧合的是,它当然可以在很短的时间内阻止其他写入。无法想象这是你的担忧。由其他trans锁定的X锁可以阻止读提交的读取器。;SQL Server快照隔离确实不会阻止或阻止其他快照。您可以删除整个表,快照将不会阻塞。;如果SQL Server希望通过对b树索引进行读未写扫描看到的下一页消失,则SQL Server可以中止查询。如果没有锁,这种情况可能会发生。坦白说,我还没有尝试过,我正在检查解决方案的可行性。所以DDL是我唯一关心的?我完全同意。