当前位置:首页 » 编程语言 » db2查询锁表sql
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

db2查询锁表sql

发布时间: 2022-11-07 13:17:51

‘壹’ DB2中如何使用sql语句进行表锁

写sql语句的时候 在后面加上一个 for update 你在去执行 增加 删除的操作 这样子表就会容易锁住啦。

‘贰’ db2 同一张表插入更新会锁表吗

会。分析DB2的锁机制,由于DB2 默认是CS的隔离级别,它的原理是,游标每到一行就会锁住改行,对于一般应用来说是足够了,但是如果遇到全表扫描,那么CS模式会锁住表中大量的行,直到查询完毕。
DB2的锁注意事项:
Ø 优化查询 Sql,建立合适的索引,使得其能够走索引查询,由于索引的范围和排序,可以直接跳过许其他行,定位到符合我们需要的行。

Ø 采用合适的隔离级别。由于DB2 默认是CS的隔离级别,它的原理是,游标每到一行就会锁住改行,对于一般应用来说是足够了,但是如果遇到全表扫描,那么CS模式会锁住表中大量的行,直到查询完毕。所以可以根据业务需求,将其改为UR模式,它不会对表加任何行锁。或者在JDBC中设置隔离级别(Isolation Levels)

‘叁’ DB2锁方面的SQL语句分析

锁表和mc_mer_trad_incom的更新频率有关系的
可以在mc_payment_flow,mc_payment_flow表上建索引减少mc_mer_trad_incom的锁表时间
如果有频繁的mc_payment_flow,mc_payment_flow表的更新操作可以直接使用X锁避免NS锁的升级
可以在select中加入with rs use and keep exclusive locks避免锁升级
数据库的参数可调整locktimeout,locklist,maxlocks

‘肆’ DB2如何解决并发锁表问题

先定位一下是哪个程序句柄导致的死锁。
方法一、查看db2diag.log文件
找到DeadLock or Lock timeout 死锁或锁超时信息
db2 force application(句柄ID)
直接结束进程即可。
方法二、DB2快照信息
1、看一下DB2快照信息
db2 get snapshot for locks on sample
可以得到类似信息:
数据库锁定快照
数据库名称 = SAMPLE
数据库路径 = D:\IBM\DB2\NODE0000\SQL00001\
输入数据库别名 = SAMPLE
挂起的锁定 = 8
当前已连接的应用程序 = 2
当前正等待锁定的代理程序数 = 1
应用程序句柄 = 54
应用程序标识 = *LOCAL.DB2.140304192925
序号 = 00001
应用程序名 = db2bp.exe CONNECT
授权标识 = DB2ADMIN
应用程序状态 = 锁定等待
应用程序代码页 = 1208
挂起的锁定 = 4
总计等待时间(毫秒) = 247867
锁定列表
锁定名称 = 0x5359534C564C3031DDECEF2841
锁定属性 = 0x00000000
发行版标志 = 0x40000000
锁定计数 = 1
挂起计数 = 0
锁定对象名 = 2312
对象类型 = 行
表空间名 = IBMDB2SAMPLEREL
表模式 = DB2ADMIN
表名 = TEST
方式 = IX
查看锁定的详细信息:db2 get snapshot for locks for application agentid 1728
----(1728是句柄ID)
3、观察命令db2 list applications的输出
查看应用程序的状态是否有锁定等待(Lock-wait)状态出现。
执行命令 list applications for db sample show detail;
4、db2 force application(句柄ID)
直接结束进程即可。

‘伍’ db2数据库里面的一张表被锁定该怎么办

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

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

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

‘陆’ db2 如何查看死锁的详细信息

db2 list applications show detail | grep -i lock

如果是Windows系统,grep命令不好用,你就用list applications命令然后仔细找吧,找到后可以用get snapshot for application命令获得快照,然后可以知道是谁hold了锁,你就能顺利解锁了

‘柒’ 在C#中怎么判断DB2的SQL表有没有锁表啊

如果要插入目标表不存在: select * into 目标表 from 表 where ... 二:如果要插入目标表已经存在: insert into 目的表 select * fro

‘捌’ db2 为什么会锁表

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

‘玖’ 如何解锁DB2中被锁定的表

1 表处于“检查暂挂”状态。未强制表的完整性并且表的内容可能是无效的
。如果从属表处于检查暂挂状态,则对于未处于检查暂挂的父表或基础表的
操作也可能接收到此错误。
2 表处于“无数据移动”状态。当处于此状态时,禁止导致数据移动的操作
。数据移动操作包括 REDISTRIBUTE、
分区键的更新、多维群集键的更新和 REORG TABLE。
3 表处于“装入暂挂”状态。对此表的先前的 LOAD
尝试失败。在重新启动或终止 LOAD 操作之前不允许对表进行存取。
4 表处于“只读”状态。此状态可以在联机装入(LOAD)处理(带有 READ
ACCESS 选项的 LOAD
INSERT)期间发生,或在联机装入(LOAD)操作后发生,除了在使用 SET
INTEGRITY 语句在表的新追加的部分验证所有约束之前。不允许对此表的更
新活动。
5 表处于“正在装入”状态。LOAD 实用程序当前对此表进行操作,直到
LOAD 完成才允许存取。
6 不能在 ESE 中刷新引用昵称的具体查询表。
用户响应:

1 对表 "<表名>" 执行带有 IMMEDIATE CHECKED 选项的 SET INTEGRITY
语句,以消除表的“检查暂挂”状态。对于用户维护的具体查询表,执行带
有 IMMEDIATE UNCHECKED 选项的语句,而不是带 IMMEDIATE CHECKED
选项。
2 对表 "<表名>" 的从属立即具体查询表和分级表执行 REFRESH TABLE
语句。可以通过先前 LOAD INSERT 操作根据 "<表名>"
的追加数据以增量方式维护这些从属立即具体化查询表和分级表的内容。
3 通过分别发出带有 RESTART 或 TERMINATER 选项的 LOAD
来重新启动或终止先前失败的对此表的 LOAD 操作。
4 发出 LOAD QUERY 命令以检查该表是否正在装入。如果是,则一直等到
LOAD 实用程序完成,或如有必要,重新启动或终止先前失败的“装入”操作
。如果“装入”当前未在进行,则发出带有 IMMEDIATE CHECKED 选项的
SET INTEGRITY 命令以验证表的新装入部分中的约束。
5 一直等到当前 LOAD 操作完成。可用使用 LOAD QUERY
命令来监视装入的进度。
6 使用 MAINTAIN BY USER
选项定义具体查询表。然后,使用带有子查询的 INSERT
语句填充具体查询表。

‘拾’ 用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上,则可以使用“控制中心”->实例->右键“应用程序”,可以看到当前的锁定情况,并且可以强行关闭某个进程,也可以显示“锁定链”。