DB2数据库脏读带锁问题
来源:互联网 发布:广东国税申报软件 编辑:程序博客网 时间:2024/06/13 23:18
数据库版本:8.2,9.5 问题描述:
在数据库中使用sqc编程(动态及静态)时,当游标声明中的sql使用with ur方式时,数据库内部执行过程中发现依旧会使用NS锁,易导致数据库内部锁超时及死锁现象的发生。
问题现象:
case1:游标定义如下:EXEC SQL DECLARE DynPara2Cur_cur CURSOR FOR SELECT * FROM UM_TXNDB.TBL_UMTXN_DYN_PARA WITH UR;
当一个事务对表格发起update命令,并且不提交,此时执行包含上述游标语句的程序,程序会处于锁等待状态,现象如下图:
快照信息如下:
Application handle = 1175
Application status = Lock-wait
Status change time =
Application code page = 1386
Application country/region code = 1
DUOW correlation token = *LOCAL.abc.100716043348
Application name = curtest
Application ID = *LOCAL.abc.100716043348
Sequence number = 0001
TP Monitor client user ID =
TP Monitor client workstation name =
TP Monitor client application name =
TP Monitor client accounting string =
ID of agent holding lock = 8
Application ID holding lock = *LOCAL.abc.100715120255
Lock name = 0x000200020000000D0000000052
Lock attributes = 0x00000000
Release flags = 0x00000001
Lock object type = Row
Lock mode = Exclusive Lock (X)
Lock mode requested = Next Key Share (NS)
Name of tablespace holding lock = USERSPACE1
Schema of table holding lock = UM_TXNDB
Name of table holding lock = TBL_UMTXN_DYN_PARA
Lock wait start timestamp = 07/16/2010 12:33:48.744331
case2:游标定义如下:EXEC SQL DECLARE DynPara2Cur_cur CURSOR FOR SELECT * FROM UM_TXNDB.TBL_UMTXN_DYN_PARA FOR READ ONLY WITH UR;
当cursor中带有FOR READ ONLY时 ,运行时将不加锁
(静态sql和动态sql问题一致,但命令行上无论游标如何定义,均不会加锁)
问题分析:
目前IBM对此还没有最终答复,从IBM官方文档上发现在对数据库查询时,没有更新或删除计划的情况下,建议带上FOR READ ONLY,以上测试现象可能就是这条建议的初衷?原文如下:
For more efficient processing of data, the database manager can block data for read-only cursors when retrieving data from a remote server. The use of the FOR UPDATE clause helps the database manager decide whether a cursor is updatable or not. Updatability is also used to determine the access path selection as well. If a cursor is not going to be used in a Positioned UPDATE or DELETE statement, it should be declared as FOR READ ONLY.
问题影响及解决方法:
影响:在游标不带for read only选项的前提下,仅以脏读with ur方式对数据库进行读取操作依旧会加锁(NS),当被访问对象上已有insert,update,delete等操作时,可能引发锁超时或死锁,给系统的并发性带来影响。
解决方法:在只读游标后带上FOR READ ONLY选项。
- DB2数据库脏读带锁问题
- DB2数据库锁的问题
- 关于db2数据库过期问题
- DB2 v9 新建数据库问题
- DB2数据库表死锁问题
- 诊断DB2数据库锁的问题
- 诊断DB2数据库锁的问题
- DB2创建数据库时的SQL1005N问题
- DB2数据库相关问题及解决方法
- WIN XP 下DB2数据库还原问题
- 求助:DB2数据库方面的问题
- 创建db2数据库需要注意问题
- DB2 数据库删除不了问题分析
- 连接DB2数据库问题:java.lang.NoClassDefFoundError
- db2数据库字段操作相关问题
- DB2数据库
- DB2数据库
- db2数据库
- 有意思的atoll函数
- 利用Server-u建立FTP站点
- JS获取当前浏览器URL
- 从Date型中,用Extract、to_char函数分别取年、月、日、时、分、秒的应用举例
- How to convert std::string to LPCWSTR in C++ (Unicode)
- DB2数据库脏读带锁问题
- BW:关于初始化,关于Delta机制,心得
- sql语句-linq语言-lambda表达式对照
- 在纯java中实现跨平台判断该进程是否已经启动
- spring发送邮件
- Android 单元测试和日志输出
- 学习3D地图引擎开发技术心得
- SQL Server 2000 挂起问题
- 获取文件夹文件(C++)