因为隔离级别确定访问数据时如何使该数据不受其他进程影响,所以您应该选择在并行性需求与数据完整性需求之间进行平衡的隔离级别。
关于本任务
您指定的隔离级别在工作单元 (UOW) 运行期间生效。 使用下列试探方法来确定编译 SQL 或 XQuery 语句时将使用的隔离级别:
- 对于静态 SQL:
- 如果在语句中指定了 isolation-clause,那么使用该子句的值。
- 如果在语句中未指定 isolation-clause,那么使用将程序包与数据库绑定时对该程序包指定的隔离级别。
- 对于动态 SQL:
- 如果在语句中指定了 isolation-clause,那么使用该子句的值。
- 如果在语句中未指定 isolation-clause,并且已在当前会话中发出
SET CURRENT ISOLATION 语句,那么使用 CURRENT ISOLATION 专用寄存器的值。
- 如果在语句中未指定 isolation-clause,并且在当前会话中未发出
SET CURRENT ISOLATION 语句,那么使用将程序包与数据库绑定时对该程序包指定的隔离级别。
- 对于静态或动态 XQuery 语句,环境的隔离级别确定对 XQuery 表达式进行求值时使用的隔离级别。
注: 许多商业编写的应用程序提供了一种选择隔离级别的方法。 有关信息,参阅应用程序文档。
您可以通过多种不同的方法来指定隔离级别。
过程
- 在语句或子查询级别:
注: 不能在语句级别指定 XQuery 语句的隔离级别。
使用 WITH 子句。 WITH UR 选项只适用于只读操作。 在其他情况下,语句将自动由 UR 更改为 CS。
此隔离级别覆盖对语句所在的程序包指定的隔离级别。 您可以对下列 SQL 语句指定隔离级别:
- DECLARE CURSOR
- 搜索 DELETE
- INSERT
- SELECT
- SELECT INTO
- 搜索 UPDATE
- 对于当前会话中的动态 SQL:
请使用 SET CURRENT ISOLATION 语句对会话中发出的动态 SQL 语句设置隔离级别。 发出此语句将对
CURRENT ISOLATION 专用寄存器设置一个值,该值用来指定当前会话中发出的任何动态 SQL 语句的隔离级别。 一旦设置
CURRENT ISOLATION 专用寄存器,此寄存器就会对会话中编译的任何后续动态 SQL 语句设置隔离级别,而不考虑该语句由哪个程序包发出。 此隔离级别一直有效,直到会话结束或 SET CURRENT ISOLATION ...已发出 RESET 语句。
- 在预编译或绑定时:
对于使用受支持的编译型语言编写的应用程序,请使用 PREP 或 BIND
命令的 ISOLATION 选项。 此外,也可以使用 sqlaprep 或
sqlabndx API 来指定隔离级别。
- 如果在预编译时创建绑定文件,那么隔离级别存储在绑定文件中。 如果在绑定时未指定隔离级别,那么缺省值是预编译期间使用的隔离级别。
- 如果未指定隔离级别,那么将使用缺省级别“游标稳定性”。
要确定程序包的隔离级别,请执行下列查询:
select isolation from syscat.packages
where pkgname = 'pkgname'
and pkgschema = 'pkgschema'
其中
pkgname 是程序包的未限定名称,而
pkgschema 是程序包的模式名。 这两个名称都必须以大写字符指定。
- 在运行时使用 JDBC 或 SQLJ 时:
注: JDBC 和 SQLJ 是在 Db2® 服务器上使用 CLI 实现的,这意味着 db2cli.ini 设置可能会影响使用 JDBC 和 SQLJ 编写和运行的内容。
要创建使用 SQLJ 的程序包并指定其隔离级别,请使用 SQLJ 概要文件定制程序(db2sqljcustomize 命令)。
- 在运行时从 CLI 或 ODBC :
使用 CHANGE ISOLATION LEVEL 命令。 借助 DB2 调用级接口 (CLI),可以在
CLI 配置中更改隔离级别。 在运行时,将 SQLSetConnectAttr 函数与
SQL_ATTR_TXN_ISOLATION 属性配合使用,以便设置 ConnectionHandle 自变量所引用的当前连接的事务隔离级别。 您还可以在 db2cli.ini 文件中使用 TXNISOLATION 关键字。
- 在支持 REXX 的数据库服务器上:
创建数据库时,会将支持 REXX 中 SQL 的不同隔离级别的多个绑定文件绑定到数据库。 创建数据库时,其他命令行处理器 (CLP) 程序包也会与该数据库绑定。
REXX 和 CLP 使用缺省 CS 隔离级别连接到数据库。 更改此隔离级别并不会更改连接状态。
要确定 REXX 应用程序正在使用的隔离级别,请检查 SQLISL 预定义 REXX 变量的值。 此值在
CHANGE ISOLATION LEVEL 命令每次执行时被更新。
- 更改用于新会话的缺省隔离级别:
在新会话中用于动态 SQL 的常规缺省隔离级别由该会话中使用的包的隔离级别确定。 虽然应用程序可以在处理期间更改此值,但数据库管理员也可以通过实现以下命令在应用程序外部更改缺省隔离级别: