Specifying the isolation level

Because the isolation level determines how data is isolated from other processes while the data is being accessed, you should select an isolation level that balances the requirements of concurrency and data integrity.

About this task

The isolation level that you specify is in effect for the duration of the unit of work (UOW). The following heuristics are used to determine which isolation level will be used when compiling an SQL or XQuery statement:
  • For static SQL:
    • If an isolation-clause is specified in the statement, the value of that clause is used.
    • If an isolation-clause is not specified in the statement, the isolation level that was specified for the package when the package was bound to the database is used.
  • For dynamic SQL:
    • If an isolation-clause is specified in the statement, the value of that clause is used.
    • If an isolation-clause is not specified in the statement, and a SET CURRENT ISOLATION statement has been issued within the current session, the value of the CURRENT ISOLATION special register is used.
    • If an isolation-clause is not specified in the statement, and a SET CURRENT ISOLATION statement has not been issued within the current session, the isolation level that was specified for the package when the package was bound to the database is used.
  • For static or dynamic XQuery statements, the isolation level of the environment determines the isolation level that is used when the XQuery expression is evaluated.
Note: Many commercially-written applications provide a method for choosing the isolation level. Refer to the application documentation for information.

The isolation level can be specified in several different ways.

Procedure

  • At the statement or subselect level:
    Note: Isolation levels for XQuery statements cannot be specified at the statement level.

    Use the WITH clause. The WITH UR option applies to read-only operations only. In other cases, the statement is automatically changed from UR to CS.

    This isolation level overrides the isolation level that is specified for the package in which the statement appears. You can specify an isolation level for the following SQL statements:
    • DECLARE CURSOR
    • Searched DELETE
    • INSERT
    • SELECT
    • SELECT INTO
    • Searched UPDATE
  • For dynamic SQL within the current session:

    Use the SET CURRENT ISOLATION statement to set the isolation level for dynamic SQL issued within a session. Issuing this statement sets the CURRENT ISOLATION special register to a value that specifies the isolation level for any dynamic SQL statements that are issued within the current session. Once set, the CURRENT ISOLATION special register provides the isolation level for any subsequent dynamic SQL statement that is compiled within the session, regardless of which package issued the statement. This isolation level is in effect until the session ends or until the SET CURRENT ISOLATION...RESET statement is issued.

  • At precompile or bind time:

    For an application written in a supported compiled language, use the ISOLATION option of the PREP or BIND commands. You can also use the sqlaprep or sqlabndx API to specify the isolation level.

    • If you create a bind file at precompile time, the isolation level is stored in the bind file. If you do not specify an isolation level at bind time, the default is the isolation level that was used during precompilation.
    • If you do not specify an isolation level, the default level of cursor stability (CS) is used.
    To determine the isolation level of a package, execute the following query:
    select isolation from syscat.packages
      where pkgname = 'pkgname'
        and pkgschema = 'pkgschema'
    where pkgname is the unqualified name of the package and pkgschema is the schema name of the package. Both of these names must be specified in uppercase characters.
  • When working with JDBC or SQLJ at run time:
    Note: JDBC and SQLJ are implemented with CLI on Db2® servers, which means that the db2cli.ini settings might affect what is written and run using JDBC and SQLJ.

    To create a package (and specify its isolation level) in SQLJ, use the SQLJ profile customizer (db2sqljcustomize command).

  • From CLI or ODBC at run time:

    Use the CHANGE ISOLATION LEVEL command. With Db2 Call-level Interface (CLI), you can change the isolation level as part of the CLI configuration. At run time, use the SQLSetConnectAttr function with the SQL_ATTR_TXN_ISOLATION attribute to set the transaction isolation level for the current connection referenced by the ConnectionHandle argument. You can also use the TXNISOLATION keyword in the db2cli.ini file.

  • On database servers that support REXX:

    When a database is created, multiple bind files that support the different isolation levels for SQL in REXX are bound to the database. Other command line processor (CLP) packages are also bound to the database when a database is created.

    REXX and the CLP connect to a database using the default CS isolation level. Changing this isolation level does not change the connection state.

    To determine the isolation level that is being used by a REXX application, check the value of the SQLISL predefined REXX variable. The value is updated each time that the CHANGE ISOLATION LEVEL command executes.

  • Changing the default isolation level used for new sessions:
    The normal default isolation level used for dynamic SQL within a new session is determined by the isolation level of the package being used in that session. While the application can change this value during its processing, the database administrator can also change the default isolation level outside of the application by either implementing: