DB2锁机制

DB2锁机制
    相比较Oracle来说,DB2的锁机制麻烦了很多,而且这个麻烦带来的不是性能的上升而是下降,
不过如果细致了解的话,只能感慨不愧是数据库理论诞生的公司,在实现数据库理论上比Oracle全面得多。
    Oracle没有实现一般数据库理论里的锁机制,带来的并发性与性能上的提升以及相关的问题上文已经介绍了,
现在来说说几乎完全实现一般数据库理论锁机制的DB2数据库这方面的实现。
    下面的资料来源于IBM资料库DB2和 Oracle的并发控制(锁)比较
    首先是锁是属性,有如下几个基本属性:锁定对象,锁定大小,锁定时间,锁定状态。
锁定对象表示锁定的数据资源,DB2支持对表空间,表,行,索引(大型机里支持对数据页)的锁定。通常考虑表锁与行锁。
锁定大小表示锁定的数据大小。
锁定时间通常由事务的隔离级别控制。
锁定状态就是锁的类型,下面将会介绍。
表 1:DB2支持的表级锁定
名称缩写     全名                                    描述
IN           无意图锁(Intent Node),不需要行锁     拥有者可以读取包括其他事务未提交数据在内的所有数据,但不能对表中的数据作出修改
IS       意图共享锁(Intent Share),需要行锁配合    拥有者可以在拥有相应行上的S锁时可以读取该行的数据,但不能修改数据
IX   意图排他锁(Intent eXclusive),需要行锁配合    拥有者可以在拥有相应行上的X锁时可以修改该行的数据
SIX 共享并且意图排他锁(Share with Intent eXclusive),需要行锁配合   拥有者可以读取表中的任何数据,如果在相应的行上可以获得X锁,可以修改该行。SIX的获取比较特殊,当程序拥有IX锁时请求S锁,或者在已经拥有S锁的时候请求IX锁时产生
S                 共享锁(Share),不需要行锁配合    可以读取表上的任何数据,如果表上被加了S锁,表上的数据只能被读取而不能做出任何修改
U                更新锁(Update),不需要行锁配合    拥有者可以读取表中的任何数据,如果升级为X锁,则可以更改表中的任何数据,该锁是等待对数据进行修改的一种中间状态
X             排他锁(eXclusive),不需要行锁配合    拥有者可以读取或者修改表中的任意数据,如果加上了X锁,除了未提交读事务外,其他程序都不能对表进行任何读取或者修改
Z   超级排他锁(Super eXclusive),不需要行锁配合    该锁一般不是由DML产生,而是由Drop,Alter或者创建删除索引时产生的,加上Z锁后,所有程序(包括未提交读程序)都不能对表进行读取或者修改
具体来说,IS,IX,SIX用于表一级并且需要行锁配合,用于阻止其他程序对表加上排他锁。区别如下:
·  如果一个程序获得表的IS锁,程序可以获得某一行上的S锁用于只读操作,其他程序也可以读取该行,或者对表中其他行作出修改。
·  如果一个程序获得表的IX锁,程序可以获得某一行的X锁用于更改操作,其他程序可以更改或者读取表中其他的行。
·  如果一个程序获得表的SIX锁,程序可以获得某一行的X锁用于更改操作,其他程序只能对表中的其他行进行只读操作。
S,U,X,Z用于表一级,不需要行锁的配合。区别如下:
·  如果程序得到表的S锁,则程序可以读表中的任意数据,同时允许其他程序获得表上的只读锁请求,如果有程序需要更改表上的数据,必须等到S锁释放。
·  如果程序得到U锁,程序可以读取表中任意数据,最终可以通过获得X锁得到对表中任意数据的修改权,其他程序只能读取表中的数据,U锁与S锁的区别在于修改意图,U锁的设计主要是为了避免两个程序在拥有S锁的情况下同时申请X锁导致死锁。
·  如果程序得到表上的X锁,程序可以读或者修改表上任意数据,其他程序无法读或者修改表上的数据。
·  如果程序获得Z锁,程序可以读或者修改表中任意数据,其他程序包括未提交读程序在内不能对表执行读或者修改操作。
IN锁用于表上以允许未提交读这一概念。
DB2支持的行锁如下所示:
名称缩写      全名               需要表锁最低级别                 描述
S           共享锁(Share)         IS                            该行正在被读取,其他程序只能执行读操作
U           更改锁(Update)        IX                            某个程序正在读取并有可能修改该行,其他程序只能读取该行
X           排他锁(eXclusive)     IX                            该行正在被某个程序修改,其他程序不能访问该行
W    弱排他锁(Weak eXclusive)     IX                            一行被插入表后,该行会加上W锁,只有锁的拥有者可以修改该行,与X锁的不同在于该锁与NW锁兼容
NS   下一键共享锁(Next Share)     IS                            拥有者与其他程序都可以读取该行,但不能进行修改,当程序处于RS或者CS隔离级别下时,该锁可以代替S锁
NX  下一键排他锁(Next  eXclusive) IX                            一行的数据被插入到索引或者从索引被删除时,该行的下一行会被加上NX锁,锁的拥有者可以读该行的数据但不能修改。该锁与X锁类似,但与NS锁兼容
NW  下一键弱排他锁(Next  Weak eXclusive) IX                     一行的数据被插入到索引时,该行的下一行会被加上NW锁,锁的拥有者可以读但不能修改该行的数据,与X锁及NX锁类似,但与W锁以及NS锁兼容
默认情况下,DB2总是尝试获取行锁,但可以使用ALTER TABLE语句修改为总是获取表锁,也可以使用LOCK TABLE语句获取表锁。
    以上就是DB2复杂的锁机制,相比较Oracle,DB2没有做任何乐观假设,写必须阻塞读,读必须阻塞写,不然会影响读一致性,这是最正统的数据库理论。
不过对于开发人员来说,这种锁机制就是一个噩梦,在写任何并发性程序之前,首先就是要分析锁,我前后用了两天才理顺DB2里各种锁之间的关系,话说,
如果可以理解上面两张锁阻塞表,估计就可以对DB2锁机制有一个清醒的认识了。
    下面是DB2的事务隔离级别,话说我一直以为只有事务级与语句级隔离级别,直到我看了DB2的事务隔离级别。
    首先是可重复读(RR-RepeatableRead)级别,这一级别怎么说呢,概括一点,这个级别会锁定所有使用到的表,直到事务结束,
保证事务开始一直到结束所可能需求的数据没有任何变化。即事务运行时,其他程序无法修改其所用到的表,
这一级别类似oracle的事务级隔离级别,但Oracle没有锁定表,只是假定没有人去修改所需求的数据。
    下一个是读稳定性(RS-ReadStability)级别,这一级别只锁定真正使用到的行(包括修改的行以及检索到的行),而且可以读到其他已提交事务的数据。
    在往下是游标稳定性(CS-CursorStability)级别,这一级别类似Oracle的语句级隔离级别,锁定的只有修改了的行,可以读取已提交事务的数据。
    最后是未提交读(UR-UncommittedRead)级 别,这一级别如题,可以读到未提交的数据,不过如果修改了数据,则其表现与CS相同,即锁定修改了的行防止别的会话修改。
    四个事务级别,确保所有可能需要的数据不要被人修改->确保已经读取的数据不要被人修改->确保修改的数据不要被别人修改->可以读取别人未提交的数据(修改的数据同样不允许被别的程序修改)。

下一个讨论的是锁转换。
    当程序向数据库请求它已经加锁的对象上面的锁的时候,数据库会比较对象上现在的锁与所请求的锁的模式,如果所请求的锁级别更高,则把现在的锁升级为请求的锁。
    锁级别比较:
    表锁:IN<IS<S<IX<U<X<Z
    行锁:S<U<X
    有一个特殊例子是,如果持有S锁请求IX锁,或者持有IX锁请求S锁,锁转换结果为SIX锁。
    下面来谈谈DB2里著名的锁升级问题。
    在学Oracle的时候,我从来不知道锁升级这个概念,这是由于Oracle中,锁并不是稀缺资源,没必要把多个锁合并为同一个锁来减少资源占用。
    DB2里有两个参数,LOCKLIST与MAXLOCKS,LOCKLIST表示数据库分配的用来储存锁列表的空间大小,MAXLOCKS表示程序最大允许占用锁列表大小的百分比,
当超过这个百分比的时候,就会进行锁升级,这里我就不发那长长的一大串DB2锁列表计算公式了,只需要知道,DB2会在一个程序锁定过多行的时候,
会把锁定多行变更为锁定整个表。这是一个Oracle里没有的概念,如果从Oracle转为DB2,需要注意。
    最后说说锁等待,这里类似Oracle里的nowait选项,DB2里面有一个参数LOCKTIMEOUT,可以设置这个参数的值来设定遇到锁阻塞后的等待时间,如果超时的话就会回滚语句。
    在DB2的开发建议里,为了实现并行化与数据完整性,有如下几个建议,比较Oracle的类似建议的话,相当有意思。
·  频繁使用commit来使多个用户可以并发地访问数据(Oracle中的建议是尽可能维护业务事务的完整性,而不是切割成小事务)
·  发出commit语句前,关闭CURSORWITH HOLD来确保所有锁都得到释放(Oracle中事务提交或者回滚后自动解锁,不需要其他操作)
·  指定适当的隔离级别。DB2会借助一切机会锁定行,需要不同的隔离级别来协调(Oracle在必要的时候使用事务级隔离,一般只需要语句级隔离级别)
·  适当使用LOCKTABLE语句(尽可能不要使用也很少有必要使用LOCL TABLE语句)
DB2的开发建议还有很多,感兴趣的可以去看看相关资料,与Oracle的开发建议比较相当有意思的。
关于两个数据库锁与并行的介绍就到这里,这篇文章中没有介绍DB2并发性的问题,但其实也没必要介绍,在锁机制部分已经到达并发性的瓶颈,并发性在DB2的锁机制下受到的限制太大了。

 

支付宝域名如何加入白名单(扫码老是弹窗) 支付宝扫码之后,遇到非支付宝官方网页,请确认是否继续访问弹窗,问题解决办法。本章教程提供解决办法,亲测有效。 阅读详情

相关推荐

DB2解决表死

NULL 博文链接:https://lxneliu.iteye.com/blog/1610166

DB2锁机制深度分析

DB2锁机制对于DB2数据库来说,有着举足轻重的意义,下面就让我们一起来了解一下什么是DB2锁机制。 在关系数据库(DB2,Oracle,Sybase,Informix和SQL Server)最小的恢复和交易单位为一个事务(Transactions),事务具有ACID(原子性,一致性,隔离性和永久性)特征。关系数据库为了确保并发用户在存取同一数据库对象时的正确性(即无丢失更新、可重复读、不读"脏

荣耀之路 1847

焊缝分割数据集-zip

数据集介绍本数据集包含焊缝图像192张,并使用伪彩色标注进行训练,下面对数据集各文件夹进行说明:1、annotations_Hui:里面包含灰度标注图像192张2、annotations_Wei: 里面包含伪彩色标注图像192张3、Hui_txt: 使用该目录下的txt将使用灰度标注图像进行训练4、Wei_txt: 使用该目录下的txt将使用伪彩色标注图像进行训练5、images: 原图所在文件夹6、label.txt: 数据集标签7、coco.json: 使用EISeg交互式分割标注工具标注生成的json文件8、*.py皆为组建数据集所使用的.py文件,使用步骤依次运行rename.py、list.py、create.py、最后view.py可为数据集可视化

DB2lock

--------------------------------------的分类: (1)读:即共享(S) (2)写:即排他(X) S可以与S兼容,不可与X兼容。 X与S和X都不可以兼容。 举例: 一条记录加了共享(S),那么其他事务也可以对该条记录加共享(S); 但是不能加排他,需要等到该共享释放之后再加排他。 一条记录加了排他(S), 那么其他...

王春雨 6391

一文搞懂 db2(表、行、共享、排他

,很好理解,每个人都在自己的房屋上安装有,你拥有了,房屋只有你能独占,别人不能访问。数据库中的也一样,只不过更加细分。 db2 中基本的有两类: 排他(X),也叫写,当某行数据正在被修改时,其他进程不能再读取或修改 共享(S),也叫读,当某行数据正在被读取时,其他进程修改 db2 事务的隔离 的这种机制都是为事务隔离来服务的,这里就不得不说下什么是事务,事务就是数据库管理系统执行过程一组数据库操作,是一个逻辑单位,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。可以简单地这

jiangxixiaolinzi的博客 4834

db2 锁机制

db2在执行delete update  insert操作的时候,使用的是排他,使用的表级别是表。在一个delete会话没有结束之前,进来的其他会话将处于等待状态。此刻所有其他insert update delete操作都是无效滴。会话结束需要commit命令才能释放表。执行delete update insert命令结束后,需要执行commit释放资源        oracle  d

mei6012006的专栏 977

深入理解DB2数据库的锁机制

本文深入解析DB2数据库的锁机制,首先介绍事务的ACID特性与的基本概念,包括共享、排它和意向的类型及其兼容性。随后探讨了四种事务隔离级别(UR、CS、RS、RR)的特点与适用场景,并提供了显式控制的SQL语法。文章详细说明了监控方法,对比了SYSIBMADM.SNAPLOCK和LOCKS_HELD视图的差异,并介绍了通过终止连接强制解的操作。最后给出生产环境的使用建议,强调合理选择隔离级别和谨慎操作的重要性,帮助DBA有效管理DB2并发环境。

szial的专栏 1069

db2如何定一张表_DB2 表情况查看

表的情况:select * from SYSIBMADM.LOCKS_HELD lhdb2 get snapshot for locks on databasename;--查看什么表被住了其中有一项: Application handle表示进程的标识号。该进程住什么表在下面会详细的列出来或list application for database yourdatabasename sh...

weixin_39805195的博客 1407

db2 表暂挂和死的解决方法

一,表暂挂解决 1.连接数据库 su - db2ydb db2 connect to tmisygdb user tmisusr using tmisusr 2.表空间挂起怎样解决? 查看表空间是否被挂起 list tablespaces show detail 而后查看信息,当表状态不为"0"(0x0000)时,就说明此表空间现在处于暂挂状态 ...

爱于心健于行 3910

DB2详解

1.的基本概念和功能 所谓(Lock),实际上是加在数据库、表空间、表、行或者数据页上的一种标记,用户在对各种数据库对象进行读取或者写入操作时首先要看该对象上的是否允许其进行相应操作。从允许用户进行操作的种类,把分成两种基本类型:共享(Shared Lock,简称S)和排它(Exclusive Lock,简称X)。 共享 共享又称为读,若事务T对数据对象A加

AndroidWebDeveloper 1万+

Db2锁机制深入:转换、等待、升级与死

本文深入解析Db2数据库锁机制,重点介绍转换、等待、升级和死四大核心概念。详细阐述不同模式的严格性分级(IS、S、IX、SIX、X、Z)及其应用场景,通过具体案例说明转换过程与规则。提供等待和死的排查方法,包括系统视图查询和日志分析,并给出升级的预防措施。通过掌握这些锁机制原理与实践技巧,可以有效提升Db2在高并发环境下的稳定性和性能表现。

szial的专栏 633

DB2 和并发

DB2 和并发 --学习资料整理 主要内容: 等待 升级 死 一、等待 1、等待:当应用程序对一个对象请求的不能够立刻得到时,该程序将进入一个等待服务的队列,等待占用该的应用程序提交或回滚来释放该。 2、定超时检测,能够防止应用程序在异常情况下无限制地等待释放定。 3、locktimeout参数配置任何应用程序

King's program process 1万+

数据库所的概念

多个用户同时对数据库的并发操作时会带来以下数据不一致的问题:    丢失更新   A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统    脏读   A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致    不可重复读   A用户读取数据,随后B

509

DB2数据库中的和并发性控制ZT

随着网络的不断发展, 现今的应用系统一般都需要相对较强的多用户同时访问的能力。作为应用系统基础的数据库产品对多用户能力的支持也就越发重要。IBM DB2 UDB作为当今较为流行的数据库产品也在不断的改进其并发处理能力。现在的DB2 UDB系统中, 主要通过和隔离级别这两个主要的工具来控制并发连接,维护数据库中的数据在高并发的环境下的安全。我们在这里将简要的阐述一下和隔离级别。DB2 UDB

insiderc的专栏 1749

DB2数据库中的和并发性控制

DB2数据库中的和并发性控制 现在的DB2 UDB系统中, 主要通过和隔离级别这两个主要的工具来控制并发连接,维护数据库中的数据在高并发的环境下的安全。 我们在这里将简要的阐述一下和隔离级别。 DB2 UDB中, 的主要作用对象是表和行, 其他如表空间和索引也是的对象, 但是因为其多为系统控制, 管理员和用户使用较少,在这里就不涉及了。 对于行级和表级, 它们...

zwt2001267的专栏 614
上一篇: ssl工作原理
下一篇: java日志组件介绍(common-logging,log4j,slf4j,logback )
iteye_21095
博客等级 码龄8年 3粉丝 45原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值