oracle 死锁超时,db2死锁和锁超时

数据库参数准备

db2 create db mydb  using codeset utf-8 territory CN

db2 update db cfg using cur_commit DISABLED

db2 get db cfg show detail |grep -i cur

Description                                   Parameter   Current Value              Delayed Value

Currently Committed                        (CUR_COMMIT) = DISABLED                   DISABLED

设置参数CUR_COMMIT=OFF

死锁监视器和数据产生:

未创建监视器前的

db2 list  tables  for  all  |grep  -i lock

[db2inst1@ora10 ~]$ db2 list  tables  for  all  |grep  -i lock

LOCKS_HELD                      SYSIBMADM       V     2018-08-25-20.10.48.564505

LOCKWAITS                       SYSIBMADM       V     2018-08-25-20.10.48.568740

SNAPLOCK                        SYSIBMADM       V     2018-08-25-20.10.48.015699

SNAPLOCKWAIT                    SYSIBMADM       V     2018-08-25-20.10.48.046247

1、创建死锁监视器

db2  "create event monitor t_lockinfomation for locking  write to unformatted event table"

db2  "set  event  monitor   t_lockinfomation  state 1"(记录事件语句)

db2 "select evmonname,EVENT_MON_STATE(evmonname) as state from syscat.eventmonitors"

2、创建死锁

a、准备数据库表

db2  "create table t11 (col char(10))"

db2  "create table t21 (col char(10))"

b、开始进行死锁模拟

打开两个CLP窗口,分别连接到sample库,然后:

在CLP1中执行:

$ db2 +c  "insert into t11 values('aaa')"

db2 +c  "insert into t33 values('aaa')"

$ 在CLP2中执行:

$ db2 +c "insert into t21 values('bbb')"

执行完插入操作后,在CLP1和CLP2中尽量同步执行以下查询:

在CLP1中执行:

$ db2 +c "select * from t21"

在CLP2中执行:

$ db2 +c "select * from t11"

不用多少时间,就会发现,CLP窗口中报错:

CLP2输出:

$ db2 +c "select * from t11"

SQL0911N  The current transaction has been rolled back because of a deadlock

or timeout.  Reason code "2".  SQLSTATE=40001

3、获取锁等待事件数据

db2 "call EVMON_FORMAT_UE_TO_TABLES ( 'LOCKING', NULL, NULL, NULL, NULL, NULL, 'RECREATE_FORCE', -1, 'SELECT * FROM T_LOCKINFOMATION ORDER BY event_timestamp')"

db2  "set  event  monitor   t_lockinfomation  state 0"

db2 list  tables  for  all  |grep  -i lock

LOCK_ACTIVITY_VALUES            DB2INST1        T     2018-08-25-20.53.42.365349

LOCK_EVENT                      DB2INST1        T     2018-08-25-20.53.41.996997

LOCK_PARTICIPANTS               DB2INST1        T     2018-08-25-20.53.42.073427

LOCK_PARTICIPANT_ACTIVITIES     DB2INST1        T     2018-08-25-20.53.42.162554

T_LOCKINFOMATION                DB2INST1        T     2018-08-25-20.15.24.159899

LOCKS_HELD                      SYSIBMADM       V     2018-08-25-20.10.48.564505

LOCKWAITS                       SYSIBMADM       V     2018-08-25-20.10.48.568740

SNAPLOCK                        SYSIBMADM       V     2018-08-25-20.10.48.015699

SNAPLOCKWAIT                    SYSIBMADM       V     2018-08-25-20.10.48.046247

产生如下表

LOCK_ACTIVITY_VALUES

LOCK_EVENT

LOCK_PARTICIPANTS

LOCK_PARTICIPANT_ACTIVITIES

4、查询死锁相关的语句

db2 "

select c.EVENT_ID,

c.EVENT_TIMESTAMP,

c.EVENT_TYPE,

c.PARTICIPANT_TYPE,

c.APPL_ID,

c.APPL_NAME,

c.AUTH_ID,

c.CLIENT_WRKSTNNAME,

c.LOCK_ESCALATION,

c.LOCK_MODE_REQUESTED,

c.LOCK_MODE,

c.LOCK_OBJECT_TYPE,

c.TABLE_NAME,

c.TABLE_SCHEMA,

d.ACTIVITY_TYPE,

d.PACKAGE_NAME,

d.PACKAGE_SCHEMA,

d.SECTION_NUMBER,

d.EFFECTIVE_ISOLATION,

d.STMT_TEXT

from

(select a.XMLID,

a.EVENT_ID,

a.EVENT_TIMESTAMP,

a.EVENT_TYPE,

b.PARTICIPANT_NO,

b.PARTICIPANT_TYPE,

b.APPL_ID,

b.APPL_NAME,

b.AUTH_ID,

b.CLIENT_WRKSTNNAME,

b.LOCK_NAME,

b.LOCK_ATTRIBUTES,

b.LOCK_ESCALATION,

case (b.LOCK_CURRENT_MODE)

when 0    then 'No Lock'

when 1    then 'IS'

when 2    then 'IX'

when 3    then 'S'

when 4    then 'SIX'

when 5    then 'X'

when 6    then 'IN'

when 7    then 'Z'

when 8    then 'U'

when 9    then 'NS'

when 10   then 'NX'

when 11   then 'W'

when 12   then 'NW' end LOCK_CURRENT_MODE ,

case (b.LOCK_MODE_REQUESTED)

when 0    then 'No Lock'

when 1    then 'IS'

when 2    then 'IX'

when 3    then 'S'

when 4    then 'SIX'

when 5    then 'X'

when 6    then 'IN'

when 7    then 'Z'

when 8    then 'U'

when 9    then 'NS'

when 10   then 'NX'

when 11   then 'W'

when 12   then 'NW' end LOCK_MODE_REQUESTED,

case (b.LOCK_MODE)

when 0    then 'No Lock'

when 1    then 'IS'

when 2    then 'IX'

when 3    then 'S'

when 4    then 'SIX'

when 5    then 'X'

when 6    then 'IN'

when 7    then 'Z'

when 8    then 'U'

when 9    then 'NS'

when 10   then 'NX'

when 11   then 'W'

when 12   then 'NW' end LOCK_MODE,

b.LOCK_OBJECT_TYPE,

b.TABLE_NAME,

b.TABLE_SCHEMA

----b.LOCK_WAIT_START_TIME,

----b.LOCK_WAIT_END_TIME

from LOCK_EVENT a,

LOCK_PARTICIPANTS b

where a.XMLID=b.XMLID) c,

(select e.XMLID,

e.PARTICIPANT_NO,

e.ACTIVITY_TYPE ,

e.PACKAGE_NAME,

e.PACKAGE_SCHEMA,

e.SECTION_NUMBER,

e.EFFECTIVE_ISOLATION,

e.STMT_TEXT

from LOCK_PARTICIPANT_ACTIVITIES e ,

(select XMLID,

PARTICIPANT_NO,

max(ACTIVITY_ID) ACTIVITY_ID

from LOCK_PARTICIPANT_ACTIVITIES

group by XMLID,PARTICIPANT_NO) f

where e.XMLID=f.XMLID and e.PARTICIPANT_NO=f.PARTICIPANT_NO and

e.ACTIVITY_ID=f.ACTIVITY_ID) d

where

c.XMLID=d.XMLID

and c.PARTICIPANT_NO=d.PARTICIPANT_NO

order by c.EVENT_ID "

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据库中存在死锁时,Oracle提供了多种方式来进行死锁查询。 1. 使用v$session和v$locked_object视图:这是最常用的方法之一,通过查询v$session和v$locked_object视图可以获得当前数据库中存在的死锁会话和被定的对象信息。可以根据定对象的信息来分析死锁发生的原因,并采取相应的解决措施。 2. 使用DBMS_LOCK申请资源:可以使用DBMS_LOCK包中的函数来获取或释放资源。例如,可以使用函数ALLOCATE_UNIQUE来分配一个唯一的资源,并使用TRY_LOCK函数来尝试获取资源。如果获取失败,则说明可能存在死锁情况。 3. 使用DBMS_SYSTEM检测死锁:可以使用DBMS_SYSTEM包中的函数来检测死锁情况。例如,可以使用函数DUMP_TRACE来将死锁信息输出到跟踪文件中,然后通过分析跟踪文件来确定死锁发生的原因。 4. 使用AWR报告来分析死锁Oracle提供了AWR(Automatic Workload Repository)报告来收集数据库性能信息,其中包括死锁信息。可以通过生成AWR报告来获取数据库的性能统计数据,并分析死锁情况。 无论采用哪种方式,一旦确定数据库中存在死锁情况,应及时采取解决措施,如发起回滚或者手动释放资源,以保证数据库的正常运行。同时,建议定期监控数据库是否存在死锁情况,并持续改进数据库设计和应用程序代码,以最大程度地减少死锁的发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值