Last week I discussed dirty reads and how isolation level (UR) is used to read uncommitted data. In the course of my research for that post, I came across a related topic: bind parameter conflict resolution for isolation and release parameters. That is, if the PLAN and the package are bound with different isolation options, which one will DB2 use during execution?
For an in-depth look at this topic, read the DB2 for z/OS 11.0 Performance Management manual:
The general rule is when a conflict exists between the bind options, DB2 will use the one that holds the locks the longest. So if the options are RELEASE(COMMIT) and RELEASE(DEALLOCATE), DB2 will always select the latter.
With isolation levels, the lock hold time increases as you go from UR to CS to RS to RR. So if one option is set to UR and another is set to RS, DB2 will use RS. The aforementioned manual includes a table that displays all of the different combinations.
As you can imagine, if you're expecting the isolation to be CS and it suddenly becomes RR, contention problems, slowdowns and even timeouts could result. I wrote this brief SQL statement to help locate these conflicts:
SELECT SUBSTR(P.CREATOR,1,8) AS CREATOR
, SUBSTR(P.NAME,1,8) AS PLAN_NAME
, SUBSTR(PK.NAME,1,8) AS PKG_NAME
, P.ISOLATION AS P_ISO
, PK.ISOLATION AS PKG_ISO
, P.RELEASE AS P_REL
, PK.RELEASE AS PKG_REL
FROM SYSIBM.SYSPLAN P
, SYSIBM.SYSPACKLIST PKL
, SYSIBM.SYSPACKAGE PK
WHERE P.NAME = PKL.PLANNAME
AND PKL.LOCATION = '*'
AND PK.LOCATION =' '
AND PKL.COLLID = PK.COLLID
AND ( (NOT P.ISOLATION = PK.ISOLATION)
(NOT P.RELEASE = PK.RELEASE));
If you have your own bind option conflict and choose to use this SQL, please let me know if it helps.