本文主要解释下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版)》

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

  1. DB2之隔离级别和锁的论述

    在DB2数据库中, 是通过行级锁和表级锁协调作用来提供较好的并发性, 同时保证数据库中数据的安全. 在DB2中缺省情况下使用行级锁(当然需要IS/IX锁配合),只有当出现锁资源不足, 或者是用命令指定 ...

  2. smarty中三种变量的访问方式

    在模板中smarty有三种变量,第一种,php分配的变量,第二种配置文件里的变量,第三种,PHP全局数组里的变量,配置文件里变量的访问方式可以是{#bgcolor#},"#"必须紧 ...

  3. information_schema中的三个关于锁的表

    在5.5中,information_schema 库中增加了三个关于锁的表(MEMORY引擎):innodb_trx         ## 当前运行的所有事务innodb_locks       ## ...

  4. js中三种定义变量 const, var, let 的区别

    js中三种定义变量的方式const, var, let的区别 1.const定义的变量不可以修改,而且必须初始化. 1 const b = 2;//正确 2 // const b;//错误,必须初始化 ...

  5. iOS中的几种锁的总结,三种开启多线程的方式(GCD、NSOperation、NSThread)

    学习内容 欢迎关注我的iOS学习总结--每天学一点iOS:https://github.com/practiceqian/one-day-one-iOS-summary OC中的几种锁 为什么要引入锁 ...

  6. DB2中错误信息说明

    DB2错误信息SQLCODE SQLSTATE (按sqlcode排序) .分类: db2数据库 2012-10-19 11:35 2942人阅读 评论(0) 收藏 举报 db2sql存储table数 ...

  7. Java中可重入锁ReentrantLock原理剖析

    本文由码农网 – 吴极心原创,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! 一. 概述 本文首先介绍Lock接口.ReentrantLock的类层次结构以及锁功能模板类AbstractQue ...

  8. Java中的双重检查锁(double checked locking)

    最初的代码 在最近的项目中,写出了这样的一段代码 private static SomeClass instance; public SomeClass getInstance() { if (nul ...

  9. 深度解析Java中的那把锁

    锁的本质 我们先来讨论锁的出现是为了解决什么问题,锁要保证的事情其实很好理解,同一件事(一个代码块)在同一时刻只能由一个人(线程)操作. 这里所说的锁为排他锁,暂不考虑读写锁的情况 我们在这里打个比方 ...

随机推荐

  1. SVN jsvnadmin 安装与基本使用

    1. jsvnadmin  介绍 https://code.google.com/p/jsvnadmin/ Svn Admin是一个Java开发的管理Svn服务器的项目用户的web应用.安装好Svn服 ...

  2. VB.NET与C# 语法区别展示

    在学习VB.NET后发现,VB.NET与C#的语法主要的不同在两个部分,这两部分搞通了,那就游刃有余,迎刃而解了.现将其对比总结如下: 一.实体部分 (与VB相比,在C#和VB.NET中,实体的使用很 ...

  3. android 在UI线程之外处理Bitmap - 开发文档翻译

    由于本人英文能力实在有限,不足之初敬请谅解 本博客只要没有注明“转”,那么均为原创,转贴请注明本博客链接链接 Processing Bitmaps Off the UI Thread 在UI线程之外处 ...

  4. elasticSearch nested exist与missing查询

    elasticSearch nested查询,简单意义上,你可以理解为,它不会被索引,只是被暂时隐藏起来,而查询的时候,开关就是使用nested query/filter去查询 下面我有一个例子,是查 ...

  5. [Algorithm] Search for matching words

    Implement an autocomplete system. That is, given a query string s and a set of all possible query st ...

  6. 【Tip】如何在chrome浏览器中查看网页的Header

    步骤:打开“开发者工具”,点Network标签,然后刷新网页,选择Name中的第一项,再点右边的Headers,就出来了. 似乎有点复杂,配合下面的图看就一目了然了.

  7. Windows 8提升普通管理员权限为超级管理员权限以及激活超级管理员Administrator

    在Windows 8下运行某些操作时(比如删除一些文件或者更改某些系统设置时)系统会提示我们权限不够.须要Administrator账户的权限. 相信很多其它的使用者都会觉得自己当前使用的账户已经是系 ...

  8. C++ extern c 用法

    一.整体代码 01.cpp #include <iostream> #include <stdio.h> #include "add.h" using na ...

  9. Struts2(七)基础小结

    一.struts2和action 二.Result 三.struts.xml 四.namespace 第一种绝对路径 <form action="${pageContext.reque ...

  10. CSS实现水平垂直居中方式

    1.定位 核心代码实现请看示例代码中的注释: <!DOCTYPE html> <html lang="zh"> <head> <meta ...