sql - DB2 trigger timing out -
i have following trigger ensures 1 record has field defaultcard=1
create trigger trg_u_xstrdcrd after update on xstoredcard referencing new n old o each row mode db2sql begin atomic if n.defaultcard = 1 update xstoredcard set defaultcard = 0 users_id = n.users_id , id <> n.id; end if; end@ i make sure 1 record has ebactive field value of 1, tried this.
create trigger trg_u_xstrdcrd after update on xstoredcard referencing new n old o each row mode db2sql begin atomic if n.defaultcard = 1 update xstoredcard set defaultcard = 0 users_id = n.users_id , id <> n.id; end if; if n.ebactive = 1 update xstoredcard set ebactive = 0 users_id = n.users_id , id <> n.id; end if; end@ but did not work, results on timeout after few minutes on update:
caused by: com.ibm.db2.jcc.b.sqlexception: db2 sql error: sqlcode: -101, sqlstate: 54001, sqlerrmc: null @ com.ibm.db2.jcc.b.zc.e(zc.java:1606) @ com.ibm.db2.jcc.b.zc.a(zc.java:1206) @ com.ibm.db2.jcc.a.db.h(db.java:149) @ com.ibm.db2.jcc.a.db.a(db.java:43) @ com.ibm.db2.jcc.a.r.a(r.java:30) @ com.ibm.db2.jcc.a.sb.g(sb.java:152) @ com.ibm.db2.jcc.b.zc.n(zc.java:1186) @ com.ibm.db2.jcc.b.ad.db(ad.java:1761) @ com.ibm.db2.jcc.b.ad.d(ad.java:2203) @ com.ibm.db2.jcc.b.ad.v(ad.java:521) @ com.ibm.db2.jcc.b.ad.executeupdate(ad.java:504) @ org.hibernate.persister.entity.abstractentitypersister.update(abstractentitypersister.java:2595) ... 19 more any advice on whats wrong or how it?
cheers! nfv
after reading this nice post, might have dawned on me few updates many. defined post update trigger, updates same table. update rows 1 user. let's have 10 rows per user , 1 row changed defaultcard flag. means update 9 rows regardless whether needed updated. doesn't sound big deal, however, if have 5,000,000 records, update 4,999,999 records though needed update 1 (namely old defaultcard record).
update xstoredcard set defaultcard = 0 users_id = n.users_id , defaultcard = 1 , id <> n.id; this statement should effect 1 or no record. instead of running 4,999,999 updates , trigger calls have 1 update.
the same true ebactive. better, if ebactive , defaultcard 1 different record, messy, since update ebactive trigger update defaultcard trigger update ebactive again. if not mistaken, in infinite loop.
begin atomic if n.defaultcard = 1 update xstoredcard set defaultcard = 0 users_id = n.users_id , defaultcard = 1 , id <> n.id; end if; if n.ebactive = 1 update xstoredcard set ebactive = 0 users_id = n.users_id , ebactive = 1 , id <> n.id; end if; end@ this should perform way better.
edit: second try
my should update dataset, if value changed.
begin atomic if n.defaultcard = 1 , o.defaultcard != 1 update xstoredcard set defaultcard = 0 users_id = n.users_id , defaultcard = 1 , id <> n.id; end if; if n.ebactive = 1 , o.ebactive !=1 update xstoredcard set ebactive = 0 users_id = n.users_id , ebactive = 1 , id <> n.id; end if; end@
Comments
Post a Comment