zoukankan      html  css  js  c++  java
  • db2 v9.7 新特性cur_commit 能够实现未提交读新特性cur_commit 能够实现未提交读

    db2 get db cfg|find "CUR_COMMIT"
    当前已落实                                   (CUR_COMMIT) = ON

    db2 update db cfg using cur_commit off
    DB20000I  UPDATE DATABASE CONFIGURATION 命令成功完成。

    SQL1363W  未动态更改为立即修改而提交的一个或多个参数。对于这些配置参数,必须在所

    有应用程序都与此数据库断开连接之后,更改才会生效。

    db2 get db cfg|find "CUR_COMMIT"
    当前已落实                                   (CUR_COMMIT) = DISABLED

    C:UsersAdministrator>db2 force application all
    DB20000I  FORCE APPLICATION 命令成功完成。
    DB21024I  此命令为异步的,可能未能立即生效。

    ---session 1 从tab2表中删除一条记录
    C:UsersAdministrator>db2 +c "delete from javan.tab2 where id=3"
    DB20000I  SQL 命令成功完成。

    C:UsersAdministrator>

    ---session 2 从tab2表中查 刚才删除的那条记录 会一直等待 知道锁定超时时间到

    C:UsersAdministrator>db2 +c "select count(*) from javan.tab2"
    SQL0911N  因为死锁或超时,所以当前事务已回滚。原因码为 "68"。  SQLSTATE=40001

    C:UsersAdministrator>db2pd -db testdb -locks

    Database Partition 0 -- Database TESTDB -- Active -- Up 0 days 00:07:59

    Locks:
    Address    TranHdl    Lockname                   Type       Mode Sts Owner
    Dur HoldCount  Att        ReleaseFlg rrIID
    0x7FB71E80 2          02000800060000000000000052 Row        ..X  G   2        ----------看这里对那条记录id=3 的行 加了row 行级x 排他锁 和s锁是排斥的所以session 2查这条记录 会等待直到超时
    1   0          0x00000020 0x40000000 0
    0x7FB72380 2          41414141415A425A7F4760B841 Internal P ..S  G   2
    1   0          0x00000000 0x40000000 0
    0x7FB72300 2          02000800000000000000000054 Table      .IX  G   2
    1   0          0x00002000 0x40000000 0

    现在我们启用db2 v9.7版本的 未提交读特性

    db2 update db cfg using cur_commit on
    DB20000I  UPDATE DATABASE CONFIGURATION 命令成功完成。
    SQL1363W  未动态更改为立即修改而提交的一个或多个参数。对于这些配置参数,必须在所有应用程序都与此数据库断开连接之后,更改才会生效。

    C:UsersAdministrator>db2 get db cfg |find "CUR_COMMIT"
    当前已落实                                   (CUR_COMMIT) = ON

    C:UsersAdministrator>

    C:UsersAdministrator>db2 connect to testdb

       数据库连接信息

    数据库服务器         = DB2/NT 9.7.1
    SQL 授权标识         = ADMINIST...
    本地数据库别名       = TESTDB

    C:UsersAdministrator>db2 get db cfg|find "CUR_COMMIT"
    当前已落实                                   (CUR_COMMIT) = ON

    C:UsersAdministrator>

    ---session 1 删除id=1的记录
    C:UsersAdministrator>db2 "select * from javan.tab2 where id=1"

    ID          NAME
    ----------- --------------------
              1 1.25125888zjadolf

      1 条记录已选择。

    C:UsersAdministrator>db2 +c "delete from javan.tab2 where id=1"
    DB20000I  SQL 命令成功完成。

    C:UsersAdministrator>
    C:UsersAdministrator>db2pd -db testdb -locks

    Database Partition 0 -- Database TESTDB -- Active -- Up 0 days 00:01:56

    Locks:
    Address    TranHdl    Lockname                   Type       Mode Sts Owner
    Dur HoldCount  Att        ReleaseFlg rrIID
    0x7FB70980 2          41414141415A425A7F4760B841 Internal P ..S  G   2     
    1   0          0x00000000 0x40000000 0
    0x7FB72900 2          02000800040000000000000052 Row        ..X  G   2   ---一样的加了x row行级锁
    1   0          0x00000020 0x40000000 0
    0x7FB71E00 2          02000800000000000000000054 Table      .IX  G   2
    1   0          0x00002000 0x40000000 0

    ---session 2 读取刚才删除id =2的记录
    C:UsersAdministrator>db2 +c "select * from javan.tab2 where id=1"

    ID          NAME
    ----------- --------------------
              1 1.25125888zjadolf

      1 条记录已选择。

    由于启用了未落实读 ,db2实现了类似oracle中undo 读的功能(虽然实现原理不一样)。
    看一下ibm官方文档对 该新特性的描述:“当前已落实”(currently committed semantics,以后会简称 CC)新特性,
    该新特性的显著特点是在游标稳定性(Cursor stability,以后会简称 CS)隔离级别时可以明显减少锁等待的出现,以及死锁的出现频率。

    数据库配置参数 cur_commit

    该数据库配置参数主要是用来控制游标稳定性扫描的行为,默认值为 ON,可选值为:

    (1)ON :打开;

    对于新创建的数据库,默认值是 ON,在此情况下,当你试图读取一个正在被其他应用程序修改的行时,将直接返回该行的当前已落实版本数据(也就是首次更改之前的值)。

    (2)AVAILABLE:可用;

    此值表示你的应用需要显式地请求“当前已落实行为”才能得到“当前已落实”结果。

    (3)DISABLED:禁用;

    如果数据库是从之前的版本升级而来,这个参数将被设置成 DISABLED,这是为了和以前版本的行为保持一致。如果你希望使用当前已落实来控制游标稳定性扫描的行为,需要将这个参数更改成 ON 。

    需要注意的是,注册表变量 DB2_EVALUNCOMMITTED、DB2_SKIPDELETED 和 DB2_SKIPINSERTED 在启用 cur_commit 参数后会受到影响。在绑定(BIND)或预编译(PRECOMPILE)时对 CONCURRENTACCESSRESOLUTION 选项指定 USE CURRENTLY COMMITTED 或 WAIT FOR OUTCOME,那么注册表变量 DB2_EVALUNCOMMITTED、DB2_SKIPDELETED 和 DB2_SKIPINSERTED 将被忽略。

    --附录
    ORACLE Snapshot 隔离级别情况下的的堵塞情况
    先出现的工作负载 后出现的工作负载 读工作负载 写工作负载
    读工作负载                          否(不堵塞) 否(不堵塞)
    写工作负载                          否(不堵塞) 是(堵塞)

    DB2 V9.7 之前的版本中使用 CS 隔离级别情况下的堵塞情况
    先出现的工作负载 后出现的工作负载 读工作负载 写工作负载
    读工作负载                          否(不堵塞) 可能
    写工作负载                          是(堵塞) 是(堵塞)

    DB2 V9.7 中启用“当前已落实”的 CS 隔离级别情况下的堵塞情况
    先出现的工作负载 后出现的工作负载 读工作负载 写工作负载
    读工作负载                        否(不堵塞) 否(不堵塞)
    写工作负载                        否(不堵塞) 是(堵塞)

  • 相关阅读:
    ASP.NET(C#) DataSet数据导出到Excel
    GridView生成导出EXECL
    Gridview 手动排序实现
    用DirectoryInfo搜索文件夹时过滤隐藏文件夹
    为 DropDownList 选项添加背景或样式 收
    IIS中 CS0016: 未能写入输出文件 …….*.dll拒绝访问
    singletontheorylazy.cs
    adaptertwowayseabird.cs
    StatefulLabel.cs
    LifecycleControl.cs
  • 原文地址:https://www.cnblogs.com/dahaoran/p/9293289.html
Copyright © 2011-2022 走看看