我想创建DB2 10.1.2当字段更新为一定值时,在该表中的行数与该值,看看是否计数(在Linux上运行LUW)触发它与另一个表中的计数相匹配,然后更新该表(例如,将任务状态汇总为工作状态)。表达它似乎很简单:DB2触发行锁定
CREATE TRIGGER AUTHORED
AFTER UPDATE OF TASK_STATUS ON TASK_TABLE
REFERENCING NEW AS N FOR EACH ROW WHEN (TASK_STATUS = 'Completed')
update JOB_TABLE set JOB_STATUS='Completed'
where JOB_TABLE.ID = N.JOB_ID
and JOB_TABLE.TOTAL_TASKS = (select count(*) from TASK_TABLE
where TASK_TABLE.JOB_ID = N.JOB_ID
and TASK_TABLE.TASK_STATUS = 'Completed')
不幸的是,它似乎是触发的情况下,触发的身体是不是在同一个工作单位,当你指望从触发锁定了这一行发生死锁更新自己。下面是“的db2pd -wlocks”输出我做一个触发更新后:
Locks being waited on :
AppHandl [nod-index] TranHdl Lockname Type Mode Conv Sts CoorEDU AppName AuthID AppID
44248 [000-44248] 111 0200040E070000000000000052 RowLock ..X G 1385 perl KJPIRES 10.0.15.139.38727.140201011731
14937 [000-14937] 15 0200040E070000000000000052 RowLock .NS W 1238 perl KJPIRES 10.0.15.139.55287.140211231609
我试图用“与UR”的内部计数,但是当我创建触发器(“SQL20159W将被明确地忽略由于语句上下文,隔离子句被忽略。SQLSTATE = 01652“)。
我也尝试过使用BEFORE和INSTEAD OF,但遇到了问题。
这看起来好像是一件常见的事情。它通常如何处理?
你有没有尝试'为每个陈述'? – AngocA
我刚刚尝试过“对于每条语句”,它仍然僵持不下。 (我不确定如果更新更新多行并且我为“每个语句”而不是“针对每一行”执行操作,但它无法正常工作会发生什么情况。) – kjpires
触发器无法在就像你说的那样,一个单独的UOW,因为触发体实际上被编译到引起触发器运行的'UPDATE'语句的计划中。你如何确定存在僵局? – mustaccio