DB2中三个有关锁变量DB2_EVALUNCOMMITTED,DB2_SKIPDELETED和DB2_SKIPINSERTED的使用

本文主要解释下DB2中三个有关锁变量DB2_EVALUNCOMMITTED,DB2_SKIPDELETED和DB2_SKIPINSERTED的使用

实验环境:

DB2 v9.7.0.6

AIX 6.1.0.0

採用默认的隔离级别CS

STUDENT表的DDL与初始内容

CREATE TABLE "E97Q6C  "."STUDENT"  (

"AGE" INTEGER ,

"NAME" CHAR(8) )

IN "USERSPACE1" ;

$ db2 "select * from student"

AGE         NAME

----------- --------

3 xu

5 gao

6 mu

6 mu

6 mu

4 three

1 an

7 record(s) selected.

--切割线--

当启用DB2_EVALUNCOMMITTED时,DB2能够对未提交的插入(INSERT)或更新(UPDATE)数据进行谓词推断。

假设未提交的数据不符合该条语句的谓词推断条件,DB2将不正确未提交数据加锁。这样避免了由于要对

未提交数据加锁引起的锁等待状态,提高了应用程序訪问的并发性。

实验 1

測试例如以下(该參数与数据库配置參数CUR_COMMIT有冲突,因此。測试之前须要先将CUR_COMMIT參数设为disabled.)

首先在session 1里做一条“未提交的插入(INSERT)操作”

session 1

---------

$ db2 +c "insert into student values(7,‘he‘)"

DB20000I  The SQL command completed successfully.

session 2

---------

$ db2 "select * from student"

SQL0911N  The current transaction has been rolled back because of a deadlock

or timeout.  Reason code "68".  SQLSTATE=40001

$ db2 "select * from student where age = 3"

SQL0911N  The current transaction has been rolled back because of a deadlock

or timeout.  Reason code "68".  SQLSTATE=40001

能够看到,在session 2里的两条语句都因锁超时而失败了。原因是假设用户在更改(UPDATE)、插入(INSERT)或

删除(DELETE)一行时,会在这一行加上排它锁。别的用户不能读、写。除非使用UR隔离级别。

如今启用DB2_EVALUNCOMMITTED变量,须要重新启动实例,之后在session 1里做相同的插入操作,session 2里做相同的查询

操作:

session 1

------------

$ db2set DB2_EVALUNCOMMITTED=ON

$ db2stop force

$ db2start

$ db2 connect to qsmiao

$ db2 +c "insert into student values(7,‘he‘)"

DB20000I  The SQL command completed successfully.

session 2

------------

$ db2 "select * from student"

SQL0911N  The current transaction has been rolled back because of a deadlock

or timeout.  Reason code "68".  SQLSTATE=40001

$ db2 "select * from student where age = 3"

AGE         NAME

----------- --------

3 xu

1 record(s) selected.

这次能够看到第2条查询语句是成功的。原因是session 1中有未提交的插入操作,session 2在扫描时,对该行进行了谓词推断,发现不符合谓词盼断条件

也就是 age = 3 , session 2就不会对该行进行加锁,因而不会导致锁超时。

DB2_SKIPDELETED变量被启用的效果是:在表訪问期间。会无条件地跳过被删除的行。

实验 2:

在默认情况下。即没有设置DB2_EVALUNCOMMITTED和DB2_SKIPDELETED变量的时候,假设session 1用提交的方式删除操作的时候,Session 2若要查询整个表,是要超时的。

例如以下:

session 1

---------

$ db2set DB2_SKIPDELETED=OFF

$ db2set DB2_EVALUNCOMMITTED=OFF

$ db2stop force

$ db2start

$ db2 connect to qsmiao

$ db2 +c "delete from student where age=6"

DB20000I  The SQL command completed successfully.

session 2

---------

$ db2 "select * from student"

SQL0911N  The current transaction has been rolled back because of a deadlock

or timeout.  Reason code "68".  SQLSTATE=40001

例如以下,如今改动DB2_SKIPDELETED为ON,那么session 2查询的时候,会无条件地跳过被删除的行,因此会成功。

session 1

---------

$ db2 rollback

$ db2set DB2_SKIPDELETED=ON

$ db2stop force

$ db2start

$ db2 connect to qsmiao

$ db2 +c "delete from student where age=6"

DB20000I  The SQL command completed successfully.

session 2

---------

$ db2 "select * from student"

AGE         NAME

----------- --------

3 xu

5 gao

4 three

1 an

4 record(s) selected.

类似的。DB2_SKIPINSERTED变量的作用是无条件地跳过被插入的行。就像它们还没有被插入。

參考资料:

牛新庄 《高级进阶DB2(第2版)》

时间: 2024-10-23 13:19:58

DB2中三个有关锁变量DB2_EVALUNCOMMITTED,DB2_SKIPDELETED和DB2_SKIPINSERTED的使用的相关文章

详解 MySql InnoDB 中的三种行锁(记录锁、间隙锁与临键锁)

详解 MySql InnoDB 中的三种行锁(记录锁.间隙锁与临键锁) 前言 InnoDB 通过 MVCC 和 NEXT-KEY Locks,解决了在可重复读的事务隔离级别下出现幻读的问题.MVCC 我先挖个坑,日后再细讲,这篇文章我们主要来谈谈那些可爱的锁. 什么是幻读? 幻读是在可重复读的事务隔离级别下会出现的一种问题,简单来说,可重复读保证了当前事务不会读取到其他事务已提交的 UPDATE 操作.但同时,也会导致当前事务无法感知到来自其他事务中的 INSERT 或 DELETE 操作,这就

DB2中错误代码池

工作中,在操作DB2数据库过程中,难免会出现一些这样那样的问题.对很多错误DB2都会有对应的SQL CODE和SQL State,通过SQL CODE和SQL State定位问题就很简单.现在把一个完整的SQLCODE和SQLState错误信息和相关解释作以下说明,一来可以自己参考,对DB2错误自行找出原因 sqlcode sqlstate 说明 000 00000 SQL语句成功完成 01xxx SQL语句成功完成,但是有警告 +012 01545 未限定的列名被解释为一个有相互关系的引用 +

DB2中常用SQL语句

DB2 提供了关连式资料库的查询语言sql(structured query language),是一种非常口语化.既易学又易懂的语法.此一语言几乎是每个资料库系统都必须提供的,用以表示关连式的操作,包含了资料的定义(ddl)以及资料的处理(dml).sql原来拼成sequel,这语言的原型以"系统 r"的名字在 ibm 圣荷西实验室完成,经过ibm内部及其他的许多使用性及效率测试,其结果相当令人满意,并决定在系统r 的技术基础发展出来 ibm 的产品.而且美国国家标准学会(ansi)

Python程序中的线程操作-锁

Python程序中的线程操作-锁 一.同步锁 1.1多个线程抢占资源的情况 from threading import Thread import os,time def work(): global n temp=n time.sleep(0.1) n=temp-1 if __name__ == '__main__': n=100 l=[] for i in range(100): p=Thread(target=work) l.append(p) p.start() for p in l:

hadoop搭建杂记:Linux下JDK环境变量的设置(三种配置环境变量的方法)

Linux下JDK环境变量的设置(三种配置环境变量的方法) Linux下JDK环境变量的设置(三种配置环境变量的方法) ①修改/etc/profile文件 如果你的计算机仅仅作为开发使用时推荐使用这种方法,因为所有用户的shell都有权使用这些环境变量,可能会给系统带来安全性问题. vi /etc/profile 在profile文件末尾加入: JAVA_HOME=/usr/share/jdk1.5.0_05PATH=$JAVA_HOME/bin:$PATHCLASSPATH=.:$JAVA_H

[数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁

注明: 本文转载自http://www.hollischuang.com/archives/914 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM引擎)和页级锁(BDB引擎 ). 行级锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁.行级锁能大大减少数据库操作的冲突.其加锁粒度最小,但加锁的

Objective-C中不同方式实现锁(一)-12-多线程

Objective-C中不同方式实现锁(一) 为什么需要使用锁,当然熟悉多线程的你,自然不会对它觉得陌生. 那你在代码中是否很好的使用了锁的机制呢?你又知道几种实现锁的方法呢? 今天一起来探讨一下Objective-C中几种不同方式实现的锁,在这之前我们先构建一个测试用的类,假想它是我们的一个共享资源,method1与method2是互斥的,代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 @implementation TestObj - (void)method1 {

【iOS】Swift中Playground,常量、变量、字符串等小结

一.代码及书写的几点变化(相比于OC) 1. 更像Java,Javascript或Python的格式了 2. 结尾的分号可写可不写了(同一行的多条语句中间必须加分号) 3. 不需要写main函数了,直接是从上往下执行 4. 文件后缀变.swift了,不再是.h与.m两个文件了 ...... 二.Playground Playground顾名思义,Play是玩的意思,ground是地方的意思.拿来玩.写demo或者测试很nice.在WWDC上演示了Playground实时显示,并演示了一个简单的小

DB2 中日期 比较

在DB2中的Date 一共识别三种格式,最常见的是这样 '2013-12-12' 对,你没看错,DB2认为这样的字符串就是Date数据 然后我们可以利用函数这样寻找日期区间 select * from users where g_time between '2003-05-04 ' and '2003-05-08' 也可以利用操作符来进行常规的日期大小比较 select * from users where g_time >= '2003-05-04 ' 这篇文档更加详细http://www.c