DB2 执行Sql 语句中时的with ur

本文介绍了DB2数据库中的四种隔离级别:UR(未提交读)、CS(游标稳定性)、RS(读稳定性)和RR(可重复读),讲解了它们的含义、行为和应用场景,帮助读者掌握数据一致性与并发控制的关键概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天查询DB2数据库,老遇到select * from XXX with ur, 好奇ur是什么作用,现在记录一下。

DB2中,共有四种隔离级:RS,RR,CS,UR,DB2提供了这4种不同的保护级别来隔离数据。隔离级是影响加锁策略的重要环节,它直接影响加锁的范围及锁的持续时间。两个应用程序即使执行的相同的操作,也可能由于选择的隔离级的不同而造成加锁的结果不同。
1、ur(Uncommited Read) 就是俗称“脏读“,在没有提交数据的时候能够读到更新的数据;是最低的隔离级别,并且提供最高的并行性。
2、cs(Cursor Stability) 在一个事务中进行查询时,允许读取提交前的数据,数据提交后,当前查询就可以读取到数据,update数据的时候并不锁表,在这一隔离级别中,游标的“当前”行是锁定的。如果该行只是被读,锁定会一直持续到一个新行被访问或者该工作单元终止。如果该行被修改,锁定会一直持续到该工作单元终止。
3、rs(Read Stability)读稳定性,在一个事务中进行查询时,不允许读取其他事务update的数据,允许读取到其他事务提交的新增数据,使用读稳定性,在同一个工作单元中的一个程序进程所检索的全部行都会被锁定。对于一个给定的游标,它要锁定所有与结果集匹配的行,例如,如果你有一个含1000行的表并且查询返回10行,那么只有那10行会被锁定。读稳定性使用中等级别的锁定。
4、rr(Repeatable Read)可重新性,可 重复读是最高的隔离级别,提供了最大程度的锁定和最少的并行。产生结果集的所有行都会被锁定,也就是说,即使不必出现在最终结果集中的行也会被锁定。在此 该工作单元结束前,任何其它程序都不能修改,删除或插入一个会影响结果集的行。重复读确保程序在一个工作单元中多次进行的同一项查询都返回结果。在一个事务中进行查询时,不允许任何对这个查询表的数据修改。

### DB2 数据库查询语句的用法与示例 #### 基础数据查询语言 DQL DB2 的数据查询语言 (Data Query Language, DQL) 是用于从数据库中检索数据的核心部分。最常用的 DQL 语句是 `SELECT`,它允许用户指定要查询的数据列、表以及过滤条件。 以下是基本的 `SELECT` 查询语句结构: ```sql SELECT column1, column2, ... FROM table_name WHERE condition; ``` 例如,在引用[^1] 中提到的一个具体例子展示了如何通过系统模式 (`funcschema`) 和函数名称 (`funcname`) 来筛选特定的函数记录: ```sql SELECT * FROM syscat.functions WHERE funcschema='TEST_AAA' AND funcname='TEST_AAA' WITH UR; ``` 此查询返回由 `syscat.functions` 系统视图定义的所有满足条件的函数条目,并使用了未提交读隔离级别 (`WITH UR`) 提高性能[^1]。 #### 连接外部程序访问 DB2 数据库 除了直接执行 SQL 脚本外,还可以利用编程接口连接到 DB2 并运行复杂的业务逻辑。Java 应用可以通过 JDBC 驱动实现这一点。下面是一个典型的 Java 方法来建立与 DB2 数据库之间的连接并执行简单的查询操作: ```java public void getConnect() { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { Class.forName("com.ibm.db2.jcc.DB2Driver").newInstance(); conn = DriverManager.getConnection( "jdbc:db2://197.1.5.74:60000/FBPMDB", "fbpmdb", "fbpmdb12"); String query = "select * from SCF_BILL"; ps = conn.prepareStatement(query); rs = ps.executeQuery(); while (rs.next()) { System.out.println(rs.getString("SCF_BILL_NO")); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (conn != null) conn.close(); if (ps != null) ps.close(); if (rs != null) rs.close(); } catch (SQLException ex) {} } } ``` 该代码片段说明了如何加载驱动器类、创建数据库连接字符串、准备 SQL 请求参数化处理以及遍历结果集中的每一行数据[^3]。 #### 创建新表及其字段定义 当需要存储新的实体对象时,则可能涉及到了另一个重要的概念——DDL(Data Definition Language),即用来描述和修改数据库架构的语言成分之一就是 CREATE TABLE 语句。如下所示的例子演示了一个名为 TEST 的关系型表格的设计方案,其中包含了四个属性:ROLE_ID、SYS_CODE、ROLE_CODE 及其对应的约束规则[^4]: ```sql CREATE TABLE "jzy"."TEST" ( ROLE_ID VARCHAR(8) NOT NULL, SYS_CODE VARCHAR(3) NOT NULL, ROLE_CODE VARCHAR(3) NOT NULL, ROLE_NAME VARCHAR(3) NOT NULL ); ``` 以上涵盖了几个关于 DB2 数据库查询的基础知识点及其实现方式。对于更深入的学习者来说,还有许多高级主题值得探索,比如索引优化、事务管理等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值