ロックの調査方法


sqllib/misc/の下にexplain.ddlが入っている。


コネクトする。
E:\Sss2003\DeadLock>db2 connect to zeus2_07 user sss using sss

      データベース接続情報

 データベース・サーバー                                      = DB2/NT 8.1.0
 SQL 許可 ID                                                 = SSS
 ローカル・データベース別名                                  = ZEUS2_07


explain.ddlを流す。
E:\Sss2003\DeadLock>db2 -tvf explain.ddl

******* IMPORTANT **********

USAGE: db2 -tf EXPLAIN.DDL

******* IMPORTANT **********


UPDATE COMMAND OPTIONS USING C OFF
DB20000I  UPDATE COMMAND OPTIONS コマンドが正常に終了しました。

CREATE TABLE EXPLAIN_INSTANCE ( EXPLAIN_REQUESTER VARCHAR(128) NOT NULL, EXPLAIN
_TIME      TIMESTAMP    NOT NULL, SOURCE_NAME       VARCHAR(128) NOT NULL, SOURC
E_SCHEMA     VARCHAR(128) NOT NULL, SOURCE_VERSION    VARCHAR(64)  NOT NULL, EXP
LAIN_OPTION    CHAR(1)      NOT NULL, SNAPSHOT_TAKEN    CHAR(1)   NOT NULL, DB2_
VERSION       CHAR(7)   NOT NULL, SQL_TYPE          CHAR(1)   NOT NULL, QUERYOPT
          INTEGER   NOT NULL, BLOCK             CHAR(1)   NOT NULL, ISOLATION
      CHAR(2)   NOT NULL, BUFFPAGE          INTEGER   NOT NULL, AVG_APPLS
  INTEGER   NOT NULL, SORTHEAP          INTEGER   NOT NULL, LOCKLIST          IN
TEGER   NOT NULL, MAXLOCKS          SMALLINT  NOT NULL, LOCKS_AVAIL       INTEGE
R   NOT NULL, CPU_SPEED         DOUBLE    NOT NULL, REMARKS           VARCHAR(25
4), DBHEAP            INTEGER   NOT NULL, COMM_SPEED        DOUBLE    NOT NULL,
PARALLELISM       CHAR(2)   NOT NULL, DATAJOINER        CHAR(1)   NOT NULL, PRIM
ARY KEY (EXPLAIN_REQUESTER, EXPLAIN_TIME, SOURCE_NAME, SOURCE_SCHEMA, SOURCE_VER
SION))
DB20000I  SQL コマンドが正常に終了しました。

CREATE TABLE EXPLAIN_STATEMENT ( EXPLAIN_REQUESTER VARCHAR(128) NOT NULL, EXPLAI
N_TIME      TIMESTAMP    NOT NULL, SOURCE_NAME       VARCHAR(128) NOT NULL, SOUR
CE_SCHEMA     VARCHAR(128) NOT NULL, SOURCE_VERSION    VARCHAR(64)  NOT NULL, EX
PLAIN_LEVEL     CHAR(1)      NOT NULL, STMTNO            INTEGER      NOT NULL,
SECTNO            INTEGER      NOT NULL, QUERYNO           INTEGER      NOT NULL
, QUERYTAG          CHAR(20)     NOT NULL, STATEMENT_TYPE    CHAR(2)      NOT NU
LL, UPDATABLE         CHAR(1)      NOT NULL, DELETABLE         CHAR(1)      NOT
NULL, TOTAL_COST        DOUBLE       NOT NULL, STATEMENT_TEXT    CLOB(2M)     NO
T NULL NOT LOGGED, SNAPSHOT          BLOB(10M)    NOT LOGGED, QUERY_DEGREE
INTEGER      NOT NULL, PRIMARY KEY (EXPLAIN_REQUESTER, EXPLAIN_TIME, SOURCE_NAME
, SOURCE_SCHEMA, SOURCE_VERSION, EXPLAIN_LEVEL, STMTNO, SECTNO), FOREIGN KEY (EX
PLAIN_REQUESTER, EXPLAIN_TIME, SOURCE_NAME, SOURCE_SCHEMA, SOURCE_VERSION) REFER
ENCES EXPLAIN_INSTANCE ON DELETE CASCADE)
DB20000I  SQL コマンドが正常に終了しました。

CREATE TABLE EXPLAIN_ARGUMENT ( EXPLAIN_REQUESTER   VARCHAR(128)  NOT NULL, EXPL
AIN_TIME        TIMESTAMP     NOT NULL, SOURCE_NAME         VARCHAR(128)  NOT NU
LL, SOURCE_SCHEMA       VARCHAR(128)  NOT NULL, SOURCE_VERSION      VARCHAR(64)
  NOT NULL, EXPLAIN_LEVEL       CHAR(1)       NOT NULL, STMTNO              INTE
GER       NOT NULL, SECTNO              INTEGER       NOT NULL, OPERATOR_ID
    INTEGER       NOT NULL, ARGUMENT_TYPE       CHAR(8)       NOT NULL, ARGUMENT
_VALUE      VARCHAR(1024), LONG_ARGUMENT_VALUE CLOB(2M)      NOT LOGGED, FOREIGN
 KEY (EXPLAIN_REQUESTER, EXPLAIN_TIME, SOURCE_NAME, SOURCE_SCHEMA, SOURCE_VERSIO
N, EXPLAIN_LEVEL, STMTNO, SECTNO) REFERENCES EXPLAIN_STATEMENT ON DELETE CASCADE
)
DB20000I  SQL コマンドが正常に終了しました。

CREATE TABLE EXPLAIN_OBJECT ( EXPLAIN_REQUESTER    VARCHAR(128) NOT NULL, EXPLAI
N_TIME         TIMESTAMP    NOT NULL, SOURCE_NAME          VARCHAR(128) NOT NULL
, SOURCE_SCHEMA        VARCHAR(128) NOT NULL, SOURCE_VERSION       VARCHAR(64)
NOT NULL, EXPLAIN_LEVEL        CHAR(1)      NOT NULL, STMTNO               INTEG
ER      NOT NULL, SECTNO               INTEGER      NOT NULL, OBJECT_SCHEMA
   VARCHAR(128) NOT NULL, OBJECT_NAME          VARCHAR(128) NOT NULL, OBJECT_TYP
E          CHAR(2)      NOT NULL, CREATE_TIME          TIMESTAMP, STATISTICS_TIM
E      TIMESTAMP, COLUMN_COUNT         SMALLINT     NOT NULL, ROW_COUNT
   BIGINT       NOT NULL, WIDTH                INTEGER      NOT NULL, PAGES
           INTEGER      NOT NULL, DISTINCT             CHAR(1)      NOT NULL, TA
BLESPACE_NAME      VARCHAR(128), OVERHEAD             DOUBLE       NOT NULL, TRA
NSFER_RATE        DOUBLE       NOT NULL, PREFETCHSIZE         INTEGER      NOT N
ULL, EXTENTSIZE           INTEGER      NOT NULL, CLUSTER              DOUBLE
   NOT NULL, NLEAF                INTEGER      NOT NULL, NLEVELS              IN
TEGER      NOT NULL, FULLKEYCARD          BIGINT       NOT NULL, OVERFLOW
      INTEGER      NOT NULL, FIRSTKEYCARD         BIGINT       NOT NULL, FIRST2K
EYCARD        BIGINT       NOT NULL, FIRST3KEYCARD        BIGINT       NOT NULL,
 FIRST4KEYCARD        BIGINT       NOT NULL, SEQUENTIAL_PAGES     INTEGER      N
OT NULL, DENSITY              INTEGER      NOT NULL, STATS_SRC            CHAR(1
)      NOT NULL, AVERAGE_SEQUENCE_GAP          DOUBLE  NOT NULL, AVERAGE_SEQUENC
E_FETCH_GAP    DOUBLE  NOT NULL, AVERAGE_SEQUENCE_PAGES        DOUBLE  NOT NULL,
 AVERAGE_SEQUENCE_FETCH_PAGES  DOUBLE  NOT NULL, AVERAGE_RANDOM_PAGES          D
OUBLE  NOT NULL, AVERAGE_RANDOM_FETCH_PAGES    DOUBLE  NOT NULL, NUMRIDS
               BIGINT  NOT NULL, NUMRIDS_DELETED               BIGINT  NOT NULL,
 NUM_EMPTY_LEAFS               BIGINT  NOT NULL, ACTIVE_BLOCKS                 B
IGINT  NOT NULL, FOREIGN KEY (EXPLAIN_REQUESTER, EXPLAIN_TIME, SOURCE_NAME, SOUR
CE_SCHEMA, SOURCE_VERSION, EXPLAIN_LEVEL, STMTNO, SECTNO) REFERENCES EXPLAIN_STA
TEMENT ON DELETE CASCADE)
DB20000I  SQL コマンドが正常に終了しました。

CREATE TABLE EXPLAIN_OPERATOR ( EXPLAIN_REQUESTER VARCHAR(128) NOT NULL, EXPLAIN
_TIME      TIMESTAMP    NOT NULL, SOURCE_NAME       VARCHAR(128) NOT NULL, SOURC
E_SCHEMA     VARCHAR(128) NOT NULL, SOURCE_VERSION    VARCHAR(64)  NOT NULL, EXP
LAIN_LEVEL     CHAR(1)      NOT NULL, STMTNO            INTEGER      NOT NULL, S
ECTNO            INTEGER      NOT NULL, OPERATOR_ID       INTEGER      NOT NULL,
 OPERATOR_TYPE     CHAR(6)      NOT NULL, TOTAL_COST        DOUBLE       NOT NUL
L, IO_COST           DOUBLE       NOT NULL, CPU_COST          DOUBLE       NOT N
ULL, FIRST_ROW_COST    DOUBLE       NOT NULL, RE_TOTAL_COST     DOUBLE       NOT
 NULL, RE_IO_COST        DOUBLE       NOT NULL, RE_CPU_COST       DOUBLE       N
OT NULL, COMM_COST         DOUBLE       NOT NULL, FIRST_COMM_COST   DOUBLE
 NOT NULL, BUFFERS           DOUBLE       NOT NULL, REMOTE_TOTAL_COST DOUBLE
   NOT NULL, REMOTE_COMM_COST  DOUBLE       NOT NULL, FOREIGN KEY (EXPLAIN_REQUE
STER, EXPLAIN_TIME, SOURCE_NAME, SOURCE_SCHEMA, SOURCE_VERSION, EXPLAIN_LEVEL, S
TMTNO, SECTNO) REFERENCES EXPLAIN_STATEMENT ON DELETE CASCADE)
DB20000I  SQL コマンドが正常に終了しました。

CREATE TABLE EXPLAIN_PREDICATE ( EXPLAIN_REQUESTER VARCHAR(128) NOT NULL, EXPLAI
N_TIME      TIMESTAMP    NOT NULL, SOURCE_NAME       VARCHAR(128) NOT NULL, SOUR
CE_SCHEMA     VARCHAR(128) NOT NULL, SOURCE_VERSION    VARCHAR(64)  NOT NULL, EX
PLAIN_LEVEL     CHAR(1)      NOT NULL, STMTNO            INTEGER      NOT NULL,
SECTNO            INTEGER      NOT NULL, OPERATOR_ID       INTEGER      NOT NULL
, PREDICATE_ID      INTEGER      NOT NULL, HOW_APPLIED       CHAR(5)      NOT NU
LL, WHEN_EVALUATED    CHAR(3)      NOT NULL, RELOP_TYPE        CHAR(2)      NOT
NULL, SUBQUERY          CHAR(1)      NOT NULL, FILTER_FACTOR     DOUBLE       NO
T NULL, PREDICATE_TEXT    CLOB(2M)     NOT LOGGED, FOREIGN KEY (EXPLAIN_REQUESTE
R, EXPLAIN_TIME, SOURCE_NAME, SOURCE_SCHEMA, SOURCE_VERSION, EXPLAIN_LEVEL, STMT
NO, SECTNO) REFERENCES EXPLAIN_STATEMENT ON DELETE CASCADE)
DB20000I  SQL コマンドが正常に終了しました。

CREATE TABLE EXPLAIN_STREAM ( EXPLAIN_REQUESTER VARCHAR(128) NOT NULL, EXPLAIN_T
IME      TIMESTAMP    NOT NULL, SOURCE_NAME       VARCHAR(128) NOT NULL, SOURCE_
SCHEMA     VARCHAR(128) NOT NULL, SOURCE_VERSION    VARCHAR(64)  NOT NULL, EXPLA
IN_LEVEL     CHAR(1)      NOT NULL, STMTNO            INTEGER      NOT NULL, SEC
TNO            INTEGER      NOT NULL, STREAM_ID         INTEGER      NOT NULL, S
OURCE_TYPE       CHAR(1)      NOT NULL, SOURCE_ID         INTEGER      NOT NULL,
 TARGET_TYPE       CHAR(1)      NOT NULL, TARGET_ID         INTEGER      NOT NUL
L, OBJECT_SCHEMA     VARCHAR(128), OBJECT_NAME       VARCHAR(128), STREAM_COUNT
     DOUBLE       NOT NULL, COLUMN_COUNT      SMALLINT     NOT NULL, PREDICATE_I
D      INTEGER      NOT NULL, COLUMN_NAMES      CLOB(2M)     NOT LOGGED, PMID
           SMALLINT     NOT NULL, SINGLE_NODE       CHAR(5), PARTITION_COLUMNS C
LOB(2M)     NOT LOGGED, FOREIGN KEY (EXPLAIN_REQUESTER, EXPLAIN_TIME, SOURCE_NAM
E, SOURCE_SCHEMA, SOURCE_VERSION, EXPLAIN_LEVEL, STMTNO, SECTNO) REFERENCES EXPL
AIN_STATEMENT ON DELETE CASCADE)
DB20000I  SQL コマンドが正常に終了しました。

CREATE TABLE ADVISE_INDEX ( EXPLAIN_REQUESTER VARCHAR(128)  NOT NULL WITH DEFAUL
T '', EXPLAIN_TIME      TIMESTAMP     NOT NULL WITH DEFAULT CURRENT TIMESTAMP, S
OURCE_NAME       VARCHAR(128)  NOT NULL WITH DEFAULT '', SOURCE_SCHEMA     VARCH
AR(128)  NOT NULL WITH DEFAULT '', SOURCE_VERSION    VARCHAR(64)   NOT NULL WITH
 DEFAULT '', EXPLAIN_LEVEL     CHAR(1)       NOT NULL WITH DEFAULT '', STMTNO
         INTEGER       NOT NULL WITH DEFAULT 0, SECTNO            INTEGER
NOT NULL WITH DEFAULT 0, QUERYNO           INTEGER       NOT NULL WITH DEFAULT 0
, QUERYTAG          CHAR(20)      NOT NULL WITH DEFAULT '', NAME              VA
RCHAR(128)  NOT NULL, CREATOR           VARCHAR(128)  NOT NULL WITH DEFAULT '',
TBNAME            VARCHAR(128)  NOT NULL, TBCREATOR         VARCHAR(128)  NOT NU
LL WITH DEFAULT '', COLNAMES          CLOB(2M)     NOT NULL, UNIQUERULE        C
HAR(1)       NOT NULL WITH DEFAULT '', COLCOUNT          SMALLINT      NOT NULL
WITH DEFAULT 0, IID               SMALLINT      NOT NULL WITH DEFAULT 0, NLEAF
           INTEGER       NOT NULL WITH DEFAULT 0, NLEVELS           SMALLINT
  NOT NULL WITH DEFAULT 0, FIRSTKEYCARD      BIGINT        NOT NULL WITH DEFAULT
 0, FULLKEYCARD       BIGINT        NOT NULL WITH DEFAULT 0, CLUSTERRATIO      S
MALLINT      NOT NULL WITH DEFAULT 0, CLUSTERFACTOR     DOUBLE        NOT NULL W
ITH DEFAULT 0, USERDEFINED       SMALLINT      NOT NULL WITH DEFAULT 0, SYSTEM_R
EQUIRED   SMALLINT      NOT NULL WITH DEFAULT 0, CREATE_TIME       TIMESTAMP
 NOT NULL WITH DEFAULT CURRENT TIMESTAMP, STATS_TIME        TIMESTAMP
   WITH DEFAULT CURRENT TIMESTAMP, PAGE_FETCH_PAIRS  VARCHAR(254)  NOT NULL WITH
 DEFAULT '', REMARKS           VARCHAR(254)           WITH DEFAULT '', DEFINER
         VARCHAR(128)  NOT NULL WITH DEFAULT '', CONVERTED         CHAR(1)
 NOT NULL WITH DEFAULT '', SEQUENTIAL_PAGES  INTEGER       NOT NULL WITH DEFAULT
 0, DENSITY           INTEGER       NOT NULL WITH DEFAULT 0, FIRST2KEYCARD     B
IGINT        NOT NULL WITH DEFAULT 0, FIRST3KEYCARD     BIGINT        NOT NULL W
ITH DEFAULT 0, FIRST4KEYCARD     BIGINT        NOT NULL WITH DEFAULT 0, PCTFREE
          SMALLINT      NOT NULL WITH DEFAULT -1, UNIQUE_COLCOUNT   SMALLINT
  NOT NULL WITH DEFAULT -1, MINPCTUSED        SMALLINT      NOT NULL WITH DEFAUL
T 0, REVERSE_SCANS     CHAR(1)       NOT NULL WITH DEFAULT 'N', USE_INDEX
  CHAR(1), CREATION_TEXT     CLOB(2M)      NOT NULL NOT LOGGED WITH DEFAULT '',
PACKED_DESC       BLOB(1M)               NOT LOGGED)
DB20000I  SQL コマンドが正常に終了しました。

CREATE TABLE ADVISE_WORKLOAD ( WORKLOAD_NAME     CHAR(128)    NOT NULL WITH DEFA
ULT 'WK0', STATEMENT_NO      INTEGER      NOT NULL WITH DEFAULT 1, STATEMENT_TEX
T    CLOB(2M)     NOT NULL NOT LOGGED, STATEMENT_TAG     VARCHAR(256) NOT NULL W
ITH DEFAULT '' , FREQUENCY         INTEGER      NOT NULL WITH DEFAULT 1, IMPORTA
NCE        DOUBLE       NOT NULL WITH DEFAULT 1, WEIGHT            DOUBLE
NOT NULL WITH DEFAULT 1, COST_BEFORE       DOUBLE, COST_AFTER        DOUBLE, COM
PILABLE        CHAR(17))
DB20000I  SQL コマンドが正常に終了しました。

COMMIT WORK
DB20000I  SQL コマンドが正常に終了しました。

CREATE INDEX STMT_I1 on EXPLAIN_STATEMENT(EXPLAIN_TIME, EXPLAIN_LEVEL, STMTNO, S
ECTNO)
DB20000I  SQL コマンドが正常に終了しました。

CREATE INDEX ARG_I1 on EXPLAIN_ARGUMENT(EXPLAIN_TIME, EXPLAIN_LEVEL, STMTNO, SEC
TNO, OPERATOR_ID)
DB20000I  SQL コマンドが正常に終了しました。

CREATE INDEX PRD_I1 on EXPLAIN_PREDICATE(EXPLAIN_TIME, EXPLAIN_LEVEL, STMTNO, SE
CTNO, OPERATOR_ID)
DB20000I  SQL コマンドが正常に終了しました。

CREATE INDEX OPR_I1 on EXPLAIN_OPERATOR(EXPLAIN_TIME, EXPLAIN_LEVEL, STMTNO, SEC
TNO, OPERATOR_ID)
DB20000I  SQL コマンドが正常に終了しました。

CREATE INDEX STM_I1 on EXPLAIN_STREAM(EXPLAIN_TIME, EXPLAIN_LEVEL, STMTNO, SECTN
O)
DB20000I  SQL コマンドが正常に終了しました。

CREATE INDEX OBJ_I1 on EXPLAIN_OBJECT(EXPLAIN_TIME, EXPLAIN_LEVEL, STMTNO, SECTN
O)
DB20000I  SQL コマンドが正常に終了しました。

COMMIT WORK
DB20000I  SQL コマンドが正常に終了しました。


E:\Sss2003\DeadLock>







何か知らんけどviewをつくる。

create view exp_locks as select operator_type,argument_type,substr(argument_value,1,30) as argument_value from explain_argument,explain_operator where explain_argument.operator_id = explain_operator.operator_id and (argument_type ='ROWLOCK' OR argument_type ='TABLOCK' )


コネクトする。
db2 => connect to zeus2_07 user sss using sss

      データベース接続情報

 データベース・サーバー                                      = DB2/NT 8.1.0
 SQL 許可 ID                                                 = SSS
 ローカル・データベース別名                                  = ZEUS2_07

viewを作る。
db2 => create view exp_locks as select operator_type,argument_type,substr(argume
nt_value,1,30) as argument_value from explain_argument,explain_operator where ex
plain_argument.operator_id = explain_operator.operator_id and (argument_type ='R
OWLOCK' OR argument_type ='TABLOCK' )
DB20000I  SQL コマンドが正常に終了しました。
db2 =>




問題のSQLをlogから拾ってくる。
今回はログイン時のselect文

    SELECT US1.KNJ_FST_NM,US1.KNJ_LST_NM,US1.KANA_NM,US1.SYAIN_KBN,US1.CMP_CD,US1.CMP_NM,US1.SGY_TYP,US1.SYUKO_SAKI_NM,US1.MAIL_ADDR,US1.KNM_FLG,US2.KNM_NO,US1.PRE_LOGIN_DTE,US2.TEN_CD,US2.KAS_CD,US2.SSK_KNR_CD,US2.TEN_KNJ_NM,US2.BU_KNJ_NM,US2.GRP_KNJ_NM,US2.YAKU_CD,US2.YAKU_NM FROM N5TSA0001 US1,N5TSA0002 US2 WHERE US1.USR_ID = 'T9900002' AND US1.STR_YMD <= DATE('2003-06-25') AND US1.END_YMD >= DATE('2003-06-25') AND US1.SSK_KBN = '0' AND US2.KNM_NO = '0' AND US1.USR_ID = US2.USR_ID AND US1.STR_YMD = US2.STR_YMD 

単発のupdate文

 UPDATE N5TSA0001 SET PRE_LOGIN_DTE = '20030625114345' WHERE USR_ID = 'T9900002' AND STR_YMD <= '2003-06-25' AND END_YMD >= '2003-06-25' 



「説明モード」にする。

db2 => set current explain mode explain
DB20000I  SQL コマンドが正常に終了しました。


select文を実行する。

db2 =>     SELECT US1.KNJ_FST_NM,US1.KNJ_LST_NM,US1.KANA_NM,US1.SYAIN_KBN,US1.CM
P_CD,US1.CMP_NM,US1.SGY_TYP,US1.SYUKO_SAKI_NM,US1.MAIL_ADDR,US1.KNM_FLG,US2.KNM_
NO,US1.PRE_LOGIN_DTE,US2.TEN_CD,US2.KAS_CD,US2.SSK_KNR_CD,US2.TEN_KNJ_NM,US2.BU_
KNJ_NM,US2.GRP_KNJ_NM,US2.YAKU_CD,US2.YAKU_NM FROM N5TSA0001 US1,N5TSA0002 US2 W
HERE US1.USR_ID = 'T9900002' AND US1.STR_YMD <= DATE('2003-06-25') AND US1.END_Y
MD >= DATE('2003-06-25') AND US1.SSK_KBN = '0' AND US2.KNM_NO = '0' AND US1.USR_
ID = US2.USR_ID AND US1.STR_YMD = US2.STR_YMD
SQL0217W  EXPLAIN
情報の要求だけが実行されており、このステートメントは実行されませんでした。
SQLSTATE=01604

説明モードを終わる。
db2 => set current explain mode no
DB20000I  SQL コマンドが正常に終了しました。

このSQLがロックしたものを表示する。
db2 => select * from exp_locks

OPERATOR_TYPE ARGUMENT_TYPE ARGUMENT_VALUE
------------- ------------- ------------------------------
FETCH         TABLOCK       INTENT SHARE
FETCH         ROWLOCK       NEXT KEY SHARE
IXSCAN        TABLOCK       INTENT SHARE
IXSCAN        ROWLOCK       NEXT KEY SHARE
FETCH         TABLOCK       INTENT SHARE
FETCH         ROWLOCK       NEXT KEY SHARE
IXSCAN        TABLOCK       INTENT SHARE
IXSCAN        ROWLOCK       NEXT KEY SHARE

  8 レコードが選択されました。

db2 =>



次にupdate文を調べる。

db2 => set current explain mode no
DB20000I  SQL コマンドが正常に終了しました。
db2 => delete from explain_instance
DB20000I  SQL コマンドが正常に終了しました。
db2 => select * from exp_locks

OPERATOR_TYPE ARGUMENT_TYPE ARGUMENT_VALUE
------------- ------------- ------------------------------

  0 レコードが選択されました。

db2 => set current explain mode explain
DB20000I  SQL コマンドが正常に終了しました。
db2 =>  UPDATE N5TSA0001 SET PRE_LOGIN_DTE = '20030625114345' WHERE USR_ID = 'T9
900002' AND STR_YMD <= '2003-06-25' AND END_YMD >= '2003-06-25'
SQL0217W  EXPLAIN
情報の要求だけが実行されており、このステートメントは実行されませんでした。
SQLSTATE=01604
db2 => set current explain mode no
DB20000I  SQL コマンドが正常に終了しました。
db2 => select * from exp_locks

OPERATOR_TYPE ARGUMENT_TYPE ARGUMENT_VALUE
------------- ------------- ------------------------------
FETCH         TABLOCK       INTENT EXCLUSIVE
FETCH         ROWLOCK       UPDATE
IXSCAN        TABLOCK       INTENT EXCLUSIVE
IXSCAN        ROWLOCK       UPDATE

  4 レコードが選択されました。

db2 =>





やっつけで解決に使った「with ur」のselect文でロックが
外れたか調べる。


db2 => delete from explain_instance
DB20000I  SQL コマンドが正常に終了しました。
db2 => set current explain mode explain
DB20000I  SQL コマンドが正常に終了しました。
db2 =>     SELECT US1.KNJ_FST_NM,US1.KNJ_LST_NM,US1.KANA_NM,US1.SYAIN_KBN,US1.CM
P_CD,US1.CMP_NM,US1.SGY_TYP,US1.SYUKO_SAKI_NM,US1.MAIL_ADDR,US1.KNM_FLG,US2.KNM_
NO,US1.PRE_LOGIN_DTE,US2.TEN_CD,US2.KAS_CD,US2.SSK_KNR_CD,US2.TEN_KNJ_NM,US2.BU_
KNJ_NM,US2.GRP_KNJ_NM,US2.YAKU_CD,US2.YAKU_NM FROM N5TSA0001 US1,N5TSA0002 US2 W
HERE US1.USR_ID = 'T9900002' AND US1.STR_YMD <= DATE('2003-06-25') AND US1.END_Y
MD >= DATE('2003-06-25') AND US1.SSK_KBN = '0' AND US2.KNM_NO = '0' AND US1.USR_
ID = US2.USR_ID AND US1.STR_YMD = US2.STR_YMD with ur
SQL0217W  EXPLAIN
情報の要求だけが実行されており、このステートメントは実行されませんでした。
SQLSTATE=01604
db2 => set current explain mode no
DB20000I  SQL コマンドが正常に終了しました。
db2 => select * from exp_locks

OPERATOR_TYPE ARGUMENT_TYPE ARGUMENT_VALUE
------------- ------------- ------------------------------
FETCH         TABLOCK       INTENT NONE
FETCH         ROWLOCK       NONE
IXSCAN        TABLOCK       INTENT NONE
IXSCAN        ROWLOCK       NONE
FETCH         TABLOCK       INTENT NONE
FETCH         ROWLOCK       NONE
IXSCAN        TABLOCK       INTENT NONE
IXSCAN        ROWLOCK       NONE

  8 レコードが選択されました。

db2 =>







select文は表にISロックと行にNSロック

OPERATOR_TYPE ARGUMENT_TYPE ARGUMENT_VALUE
------------- ------------- ------------------------------
FETCH         TABLOCK       INTENT SHARE
FETCH         ROWLOCK       NEXT KEY SHARE
IXSCAN        TABLOCK       INTENT SHARE
IXSCAN        ROWLOCK       NEXT KEY SHARE
FETCH         TABLOCK       INTENT SHARE
FETCH         ROWLOCK       NEXT KEY SHARE
IXSCAN        TABLOCK       INTENT SHARE
IXSCAN        ROWLOCK       NEXT KEY SHARE



update文は表にIXロックと行にUロック

OPERATOR_TYPE ARGUMENT_TYPE ARGUMENT_VALUE
------------- ------------- ------------------------------
FETCH         TABLOCK       INTENT EXCLUSIVE
FETCH         ROWLOCK       UPDATE
IXSCAN        TABLOCK       INTENT EXCLUSIVE
IXSCAN        ROWLOCK       UPDATE

ダーティリードのselect文は表にINロックで行にはロックなし。

OPERATOR_TYPE ARGUMENT_TYPE ARGUMENT_VALUE
------------- ------------- ------------------------------
FETCH         TABLOCK       INTENT NONE
FETCH         ROWLOCK       NONE
IXSCAN        TABLOCK       INTENT NONE
IXSCAN        ROWLOCK       NONE
FETCH         TABLOCK       INTENT NONE
FETCH         ROWLOCK       NONE
IXSCAN        TABLOCK       INTENT NONE
IXSCAN        ROWLOCK       NONE



で、伏見ブックの473ページのマトリックスによれば
selectのNSロックとupdateのIXロックがぶつかってるのがわかる。

ダーティリードにすると。
selectの行ロックは外れてぶつかるものがなくなる。






select for updateにすると何が変わるのかな?

db2 => commit
DB20000I  SQL コマンドが正常に終了しました。
db2 => delete from explain_instance
SQL0100W  FETCH、UPDATE または DELETE
の対象となる行がないか、または照会の結果が空の表です。  SQLSTATE=02000
db2 => commit
DB20000I  SQL コマンドが正常に終了しました。
db2 => set current explain mode explain
DB20000I  SQL コマンドが正常に終了しました。
db2 =>  select * from N5TSA0001 WHERE USR_ID = 'T9900002' AND STR_YMD <= '2003-0
6-25' AND END_YMD >= '2003-06-25' AND END_YMD >= '2003-06-25' for update of pre_
login_dte
SQL0217W  EXPLAIN
情報の要求だけが実行されており、このステートメントは実行されませんでした。
SQLSTATE=01604
db2 => set current explain mode no
DB20000I  SQL コマンドが正常に終了しました。
db2 => select * from exp_locks

OPERATOR_TYPE ARGUMENT_TYPE ARGUMENT_VALUE
------------- ------------- ------------------------------
FETCH         TABLOCK       INTENT EXCLUSIVE
FETCH         ROWLOCK       UPDATE
IXSCAN        TABLOCK       INTENT EXCLUSIVE
IXSCAN        ROWLOCK       UPDATE

  4 レコードが選択されました。

db2 =>



select for update with csにすると。

db2 => delete from explain_instance
DB20000I  SQL コマンドが正常に終了しました。
db2 => commit
DB20000I  SQL コマンドが正常に終了しました。
db2 => set current explain mode explain
DB20000I  SQL コマンドが正常に終了しました。
db2 =>  select * from N5TSA0001 WHERE USR_ID = 'T9900002' AND STR_YMD <= '2003-0
6-25' AND END_YMD >= '2003-06-25' AND END_YMD >= '2003-06-25' for update of pre_
login_dte with cs
SQL0217W  EXPLAIN
情報の要求だけが実行されており、このステートメントは実行されませんでした。
SQLSTATE=01604
db2 => set current explain mode no
DB20000I  SQL コマンドが正常に終了しました。
db2 => select * from exp_locks

OPERATOR_TYPE ARGUMENT_TYPE ARGUMENT_VALUE
------------- ------------- ------------------------------
FETCH         TABLOCK       INTENT EXCLUSIVE
FETCH         ROWLOCK       UPDATE
IXSCAN        TABLOCK       INTENT EXCLUSIVE
IXSCAN        ROWLOCK       UPDATE

  4 レコードが選択されました。

db2 =>





JOINしてるとfor updateは効かないらしい。

db2 =>     SELECT US1.KNJ_FST_NM,US1.KNJ_LST_NM,US1.KANA_NM,US1.SYAIN_KBN,US1.CM
P_CD,US1.CMP_NM,US1.SGY_TYP,US1.SYUKO_SAKI_NM,US1.MAIL_ADDR,US1.KNM_FLG,US2.KNM_
NO,US1.PRE_LOGIN_DTE,US2.TEN_CD,US2.KAS_CD,US2.SSK_KNR_CD,US2.TEN_KNJ_NM,US2.BU_
KNJ_NM,US2.GRP_KNJ_NM,US2.YAKU_CD,US2.YAKU_NM FROM N5TSA0001 US1,N5TSA0002 US2 W
HERE US1.USR_ID = 'T9900002' AND US1.STR_YMD <= DATE('2003-06-25') AND US1.END_Y
MD >= DATE('2003-06-25') AND US1.SSK_KBN = '0' AND US2.KNM_NO = '0' AND US1.USR_
ID = US2.USR_ID AND US1.STR_YMD = US2.STR_YMD  for update of PRE_LOGIN_DTE with
cs
SQL0511N  カーソルで指定された表が変更できないので、FOR UPDATE
文節は使用できません。  SQLSTATE=42829
db2 =>


2003/06/25 ugya@lycos.com