当前位置:首页 » 数据仓库 » db2数据库表上锁了
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

db2数据库表上锁了

发布时间: 2023-05-06 21:43:50

1. 用sql如何给DB2表加锁和解锁

在DB2的命令行中输入:
update monitor switches using lock on table on
然后打开另一个DB2命令窗口执行我的那个被吊死的Update语句。
然后在第一个DB2命令窗口执行: [@more@]get snapshot for locks on Database_Name(你的数据库的名字)> locks.TXT

然后,可以看到第一个DB2的窗口有一个信息输出,把这些信息输出到TXT中,大致如下:

应用程序句柄 = 36
应用程序标识 = AC100C47.IC05.00F6C6095828
序号 = 0246
应用程序名 = java.exe
CONNECT 授权标识 = DB2ADMIN
应用程序状态 = UOW 正在等待
状态更改时间 = 未收集
应用程序代码页 = 1208
挂起的锁定 = 0
总计等待时间(毫秒) = 0

应用程序句柄 = 43
应用程序标识 = *LOCAL.DB2.060512054331
序号 = 2273
应用程序名 = java.exe
CONNECT 授权标识 = DB2ADMIN
应用程序状态 = 联合请求暂挂
状态更改时间 = 未收集
应用程序代码页 = 1208
挂起的锁定 = 6
总计等待时间(毫秒) = 0

锁定列表
锁定名称 = 0x031F9052000000000000000055
锁定属性 = 0x00000000
发行版标志 = 0x40000000
锁定计数 = 255
挂起计数 = 0
锁定对象名 = 0
对象类型 = 内部
方式 = S

锁定名称 = 0x26800000000000000000000044
锁定属性 = 0x00000000
发行版标志 = 0x40000000
锁定计数 = 1
挂起计数 = 0
锁定对象名 = 0
对象类型 = 内部
方式 = S

锁定名称 = 0x020006000F1700000000000052
锁定属性 = 0x00000000
发行版标志 = 0x00000001
锁定计数 = 1
挂起计数 = 0
锁定对象名 = 5903
对象类型 = 行
表空间名 = USERSPACE1
表模式 = DB2ADMIN
表名 = C_USER
方式 = NS

锁定名称 = 0x01000000010000000500BC0056
锁定属性 = 0x00000000
发行版标志 = 0x40000000
锁定计数 = 1
挂起计数 = 0
锁定对象名 = 0
对象类型 = 内部变化锁定
方式 = S

锁定名称 = 0x535953534E333030FD965C0641
锁定属性 = 0x00000000
发行版标志 = 0x40000000
锁定计数 = 1
挂起计数 = 0
锁定对象名 = 0
对象类型 = 内部方案锁定
方式 = S

锁定名称 = 0x02000600000000000000000054
锁定属性 = 0x00000000
发行版标志 = 0x00000001
锁定计数 = 1
挂起计数 = 0
锁定对象名 = 6
对象类型 = 表
表空间名 = USERSPACE1
表模式 = DB2ADMIN
表名 = C_USER
方式 = IS

应用程序句柄 = 557
应用程序标识 = *LOCAL.DB2.060512053913
序号 = 1254
应用程序名 = java.exe
CONNECT 授权标识 = DB2ADMIN
应用程序状态 = 联合请求暂挂
状态更改时间 = 未收集
应用程序代码页 = 1208
挂起的锁定 = 6
总计等待时间(毫秒) = 0

锁定列表
锁定名称 = 0x031F9052000000000000000055
锁定属性 = 0x00000000
发行版标志 = 0x40000000
锁定计数 = 255
挂起计数 = 0
锁定对象名 = 0
对象类型 = 内部
方式 = S

锁定名称 = 0x26800000000000000000000044
锁定属性 = 0x00000000
发行版标志 = 0x40000000
锁定计数 = 1
挂起计数 = 0
锁定对象名 = 0
对象类型 = 内部
方式 = S

锁定名称 = 0x02000600071D00000000000052
锁定属性 = 0x00000000
发行版标志 = 0x00000001
锁定计数 = 1
挂起计数 = 0
锁定对象名 = 7431
对象类型 = 行
表空间名 = USERSPACE1
表模式 = DB2ADMIN
表名 = C_USER
方式 = NS

锁定名称 = 0x01000000010000000500BC0056
锁定属性 = 0x00000000
发行版标志 = 0x40000000
锁定计数 = 1
挂起计数 = 0
锁定对象名 = 0
对象类型 = 内部变化锁定
方式 = S

锁定名称 = 0x535953534E333030FD965C0641
锁定属性 = 0x00000000
发行版标志 = 0x40000000
锁定计数 = 1
挂起计数 = 0
锁定对象名 = 0
对象类型 = 内部方案锁定
方式 = S

锁定名称 = 0x02000600000000000000000054
锁定属性 = 0x00000000
发行版标志 = 0x00000001
锁定计数 = 1
挂起计数 = 0
锁定对象名 = 6
对象类型 = 表
表空间名 = USERSPACE1
表模式 = DB2ADMIN
表名 = C_USER
方式 = IS

其中应用程序句柄43和557的状态都是死锁了,猜测是这2个应用争用DB2的表,造成死锁,根据日志提示,在DB2的命令窗口输入:
force application (43)
force application (557)
提示这个操作是异步的,我执行list applicaions,结果进程中还有那2个进程,那2个进程可能是在执行比较大的操作,需要耐心等待,如何还不行,则使用下面的命令来强制所有的应用都停止,然后重启DB2:
force application all
terminate
db2stop force
db2start
如果DB2在Window上,则可以使用“控制中心”->实例->右键“应用程序”,可以看到当前的锁定情况,并且可以强行关闭某个进程,也可以显示“锁定链”。

2. db2 导入数据之后,有几张表被锁住,提示是表不活动,不能被访问,请问是什么原因

请问你是用LOAD还是IMPORT导入数据,如果用LOAD就可能存在这种情况。

LOAD锁表大概有两种情况,
一是你的数据库日志为归档日志,但是在使用LOAD的时候没有指定LOAD之后数据不可恢复,导致你的表空间被锁定,处于Backup pendding 状态,这种情况数据库会要求你做数据库备份或者表空间备份。
二是数据装载时有主外键的表违反了主外键约束,表被锁定,这种情况可以使用语句来解除表的锁定
SET INTEGRITY FOR <table_schema>.<table_name> IMMEDIATE CHECKED

3. 数据库死锁,并发问题

补充楼主:
其实我没什么经验,只不过是了解一些基础的东西罢了。
一楼的 一朵瘩红花 实际经验很丰富,你可以向她咨询一下。

你问的问题挺好得。三个概念紧密联系在一起。
这样说吧:并发的几个事务同时发生,不加锁控制的话数据就会乱套了,而加了锁后,又是并发访问会出现死锁,所以就会出现避免死锁的一些措施。
首先谈并发:理论指的是在一段时间同时对某件事进行操作。 注意精度问题,修改数据库是在一段时间内操作,不是在某个时刻,而日志则会从 时刻 开始记录你的操作。

造成死锁的原因是为了防止 不同的用户同时间(不是时刻)都对某个数据修改,造成访问不一致的问题。
比如你读了数据库的一个数据然后把它修改了并存回去,是需要时间的(假如是student表中的有个grade属性,你改了一条记录的一个值)在这个过程当中,有人又访问了数据库并且恰恰访问的是存回去之前的数据,然后他要进行操作,过了一段时间,此时你已经存回去了数据。会发现原来的数据被改动了。这时数据就乱套了。(专业术语叫读脏数据,其实还有很多其他类似这种导致前后数据不一致的问题)所以为了限定这种操作,数据库设计了-----锁---来锁定这种操作。就是你正在操作某个数据的时候----通常之前会先锁定这个数据,这样别人就不能对此数据操作了(严格来说就是只能读,不能改),必须等你操作完才能对此数据修改等操作,这就在一定程度上避免了前后操作数据不一致的问题。

但是有了锁后,新问题出现了,就是死锁:

简单解释死锁:进程A等待进程B释放他的资源,B又等待A释放他的资源,这样就互相等待就形成死锁

官方解释死锁
死锁,根本原因在于对共享存储区的访问。在数据库中也一样,如果需要“修改”一条数据,首先数据库管理系统会在上面加锁,以保证在同一时间只有一个事务能进行修改操作。锁有多种实现方式,比如意向锁,共享-排他锁,锁表,树形协议,时间戳协议等等。锁还有多种粒度,比如可以在表上加锁,也可以在记录上加锁。

在并发控制中,锁是非常重要的。
至于在Oracle还是别的数据库管理系统中,死锁产生的原因没有不同,不同的顶多是锁的实现或者死锁的恢复等罢了

再来说说事务:
事务简单来说就是 一系列的对数据库的操作揉在一起,要么同时完成,要么就都不完成。
比如---你要取钱的过程就可以当成是一个小的事务: 插卡,输入取钱金额,取走钱,拿出来卡。此过程缺一不可。把所有这些过程细节封装起来就成为一个事务。
以oracle数据库为例:
一个事务(你可以认为是一系列业务的操作)起始于dml语句(insert、update、delete)
即一条dml语句就做为一个事务的起始,然后根据业务需要,进行其他的dml操作都算是事务的一部分。
最后碰到commit。或者rollback,或者其他意外什么的都算作一个事务的结束。
整个过程就是一个事务。
事务的理论解释就是那四个什么特性:什么原子性、一致性、隔离性和持久性
简称ACID

剩下的:数据库是建立在操作系统之上的一个层次。
你问的是数据库的存储机制??工作机制??还是什么的??
数据库就是存数据的。数据库管理系统是 对存的数据进行高效率的管理
大的结构分物理数据跟逻辑数据。
物理数据就是数据在存储设备上的存储方式,什么物理联系,物理结构,物理记录等 术语。
逻辑数据就是程序员和用户看到的数据形式。什么逻辑联系,逻辑结构==同上
数据库管理类系统就是把这些逻辑跟物理相互转换。 好比你输入的叫逻辑数据存储在磁盘上叫物理数据。等等。

废话了一堆,也不知道回答对你的问题没~~

4. db2 为什么会锁表

建议题主去看锁机制,只要有数据有大量并发读写,都需要加锁,否则影响事务一致性对生产系统是不能够容忍的。

5. 如何查询db2数据库表是否被锁

1、首先点击桌面上的SQL server数据库。

6. db2数据库里面的一张表被锁定,怎么解锁

请教各位:DB2数据库里如何判断一个表被锁
1、执行命令打开锁的监视开光
UPDATE
MONITOR
SWITCHES
USING
lock
on==>;>;
2、查看数据库的锁的情况
get
snapshot
for
locks
on
tberp
3、某一个用户的锁的情况
get
snapshot
for
application
applid
C0A8084A.040A.031015144751
4、如果表被锁可以关闭该应用连接
force
application
ID1
5、看正在运行的程序有没有处于锁等待状态的
list
applications
for
db
tberp
show
detail

7. DB2数据库发生死锁了怎么办

db2 get snapshot for locks on sample
db2 get db cfg for sample
db2 update db cfg using dlchktime 10000
-查看数据库管理器级别快照信息
db2 get snapshot for dbm
-查看数据库级别快照信息
db2 get snapshot for database on dbname
-查看应用级别快照信息
db2 get snapshot for application agentid appl-handler
注:appl-handler可以从list applicaitions的输出中得到
-查看表级别快照信息
db2 get snapshot for tables on dbname
注:需要把tables快照开关设为ON才会有作用
-查看锁快照信息
db2 get snapshot for locks on dbname

db2 get snapshot for locks on for application agentid appl-handler
-查看动态sql语句快照信息
db2 get snapshot for dynamic sql on dbname

db2 get monitor switches
db2 update monitor switches using lock on statement on
create event monitor mymonitor for deadlocks,statements write to file 'c:/temp'
set event monitor mymonitor state 1
db2evmon - path 'c:/temp'

--转自:http://blog.csdn.NET/rodjohnsondoctor/article/details/4323514

---

第1页:上线前的准备
第2页:维护时的注意事项
第3页:发生死锁后的对策

【IT168 技术文档】在新的数据库应用系统上线初期,由于测试不完善或不熟悉DB2的机制,常会出现锁等待死锁等现象存在于我们的应用系统中,如何捕获锁等待或死锁信息并解决锁问题,是保证平稳上线必须面对的问题。目前应用系统最常使用的DB2数据库版本有多个,有8.1,8.2,9.1还有新推出的9.5,对于不同版本的DB2数据库提供的解决办法不尽相同,下面对于上述问题的解决作了一个简单说明,希望对大家有用。

首先在上线前有几件跟锁相关的事情需要开发设计人员一定要做好

1. 相关参数的更改

注册表变量参数:

DB2_EVALUNCOMMITTED=on 当启用此变量时,在可能的情况下,它将进行表或索引访问扫描以延迟或避免行锁定,直到知道数据记录满足谓词求值为止。

DB2_SKIPDELETED=on 当启用此变量时,在可能的情况下,它允许使用无条件地跳过已删除的键或跳过已删除的行。

DB2_SKIPINSERTED=on 当启用此变量时,在可能的情况下,它允许跳过未落实的已插入行,就好像从未插入这些行一样。

数据库参数:

LOCKLIST 锁定列表的内存量,当此参数设置为 AUTOMATIC 时,就启用了自调整功能。这允许内存调整器根据工作负载需求变化动态地调整此参数控制的内存区大小。如果不是自动,需要设置相对大一些;DB2默认是行锁,每个行锁大约占64或128个字节(64位数据库),计算锁定列表内存的大小公式是: ( 每个应用程序的平均锁定数目的估计值 * 每个锁定所需的字节数(128或64) * maxappls(或者max_coordagents) /4096 ) * 120%,这里只是建议公式,实际情况还要视操作系统实际的内存量来定。

MAXLOCKS 升级前锁定列表的最大百分比,默认是22%(windows)或10%(unix),可以根据要求自行改动,计算公式是 2 * 100 / maxappls

DLCHKTIME 死锁检测时间间隔,默认是10000毫秒(10秒),可以根据要求自行改动,也可不动。增大此参数以降低检查死锁的频率,因此增加应用程序必须等待消除死锁的时间。 减小此参数会增大检查死锁的频率,从而减少应用程序必须等待死锁解决的时间,但是会增加数据库管理器检查死锁所花的时间。

LOCKTIMEOUT 锁等待时间,默认是 -1,也就是永远等待,请改成固定的值,在事务处理(OLTP)环境中,可以使用 30 秒的初始启动值。在一个只查询的环境中,您可以从一个较高的值开始。

LOGFILSIZ 日志文件大小,此参数定义每个主日志文件和辅助日志文件的大小。如果数据库要运行大量更新、删除或插入事务,而这将导致日志文件很快变满,则应增大日志文件,了解您的并发应用程序的日志记录需求,来确定一个不会分配过量而浪费空间的日志文件大小。

LOGPRIMARY 主日志文件数,了解您的并发应用程序的日志记录需求,适当增大日志文件数。

注意: 在更新参数时,需要注意有些参数在更改后需要重新启动数据库DB2实例才可以生效;有些参数需要断开当前所有的应用程序,重新链接才能生效;有些参数可以立即生效,使用者请参考相关文档,注意参数生效特性。

2. 应用程序设计

-程序尽量短小精悍

-程序尽量晚地访问关键资源

-程序尽可能快地提交工作

-程序尽可能快地关闭游标

-建立合适索引

3. 性能测试

要根据将来实际的并发用户数和数据量进行测试

上线之后维护时我们要做的几件事情

1. 做好定期维护

通过使用如下命令进行维护:
-reorg表和索引定期重组
-runstats表和索引的统计信息定期更新
-rebind 程序包定期重新编译

8. DB2数据库发生死锁了怎么办

数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在耐旦段于解决死锁,通过SQL Server 2005, 现在似乎有了一种新的解决办法。

将下面的SQL语句放在两个不同的连接里面,并且在5秒内同时执行,将会发生死锁。

use Northwind
begin tran
insert into Orders(CustomerId) values(@#ALFKI@#)
waitfor delay @#00:00:05@#
select * from Orders where CustomerId = @#ALFKI@#
commit
print @#end tran@#

SQL Server对付死锁的办法是牺牲掉其中的一个,抛出异常,并且回滚事务。在SQL Server 2000,语句一旦发生异常,T-SQL将不会继续运行,上面被牺牲的连接中, print @#end tran@#语句将不会被运行,所以我们很难在SQL Server 2000的T-SQL中对死锁进行进一步的处理。

现在不同了,SQL Server 2005可以在T-SQL中对异常进行捕获,这样就给我们提供了一条处理死锁的途径:

下面利用的try ... catch来解决死锁。

SET XACT_ABORT ON
declare @r int
set @r = 1
while @r <昌誉= 3
begin
begin tran

begin try
insert into Orders(CustomerId) values(@#ALFKI@#)
waitfor delay @#00:00:05@#
select * from Orders where CustomerId = @#ALFKI@#

commit
break
end try

begin catch
rollback
waitfor delay @#00:00:03@#
set @r = @r + 1
continue
end catch
end

解决方法当然就是重试,但捕获错误是前提。rollback后面的waitfor不可少,发生冲突后需要等待一段时间,@retry数目可以调整以应付不同的迟悄要求。

但是现在又面临一个新的问题: 错误被掩盖了,一但问题发生并且超过3次,异常却不会被抛出。SQL Server 2005 有一个RaiseError语句,可以抛出异常,但却不能直接抛出原来的异常,所以需要重新定义发生的错误,现在,解决方案变成了这样:

declare @r int
set @r = 1
while @r <= 3
begin
begin tran

begin try
insert into Orders(CustomerId) values(@#ALFKI@#)
waitfor delay @#00:00:05@#
select * from Orders where CustomerId = @#ALFKI@#

commit
break
end try

begin catch
rollback
waitfor delay @#00:00:03@#
set @r = @r + 1
continue
end catch
end
if ERROR_NUMBER() <> 0
begin
declare @ErrorMessage nvarchar(4000);
declare @ErrorSeverity int;
declare @ErrorState int;
select
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
raiserror (@ErrorMessage,
@ErrorSeverity,
@ErrorState
);
end

我希望将来SQL Server 2005能够直接抛出原有异常,比如提供一个无参数的RaiseError。

因此方案有点臃肿,但将死锁问题封装到T-SQL中有助于明确职责,提高高层系统的清晰度。现在,对于DataAccess的代码,或许再也不需要考虑死锁问题了。

9. db2数据库里面的一张表被锁定,怎么解锁

步骤一:使用命令get snapshot来查询哪些进程锁了哪些表。

步骤二:使用春渣命令force来断开这些进行了死锁的进程来。

步骤三: 使用命令list application查看是否已经断开了哪些进行了死锁的进程。