doushi 发表于 2009-11-04 15:15

DB2 死锁

一个是C程序。另一个是java的web程序。它们共同作用于A表。
C程序对A表,先是清空;再是插入数据。然后一起提交。
java的web程序是对A表进行检索。
当C程序跑的时候。大概2分钟左右能跑完。
这个时候要是在画面上java访问A表的话,就会造成死锁C程序报错。
个人感觉不是超时,因为 Lock timeout (sec)(LOCKTIMEOUT) = 720
实在是搞不定,望帮忙!
++++++++++++++++++++++++++++++++++++++++++++++++++++
++ ProgramID: (911)StartTime:
SQL Insert Error code   : -911
         Input Count: 39043
Input(All)    count = 66666
Input(Select) count = 60000
Input(Skip)   count = 666
param         count = 25
Update      count = 0
Insert      count = 0
++ ProgramID: (911)EndTime:
++++++++++++++++++++++++++++++++++++++++++++++++++++

Dynamic SQL Query management         (DYN_QUERY_MGMT) = = DISABLE
                                                         
Discovery support for this database       (DISCOVER_DB) = = ENABLE
                                                         
Default query optimization class         (DFT_QUERYOPT) = = 5
Degree of parallelism                      (DFT_DEGREE) = = 1
Continue upon arithmetic exceptions   (DFT_SQLMATHWARN) = = NO
Default refresh age                   (DFT_REFRESH_AGE) = = 0
Number of frequent values retained   (NUM_FREQVALUES) = = 10
Number of quantiles retained            (NUM_QUANTILES) = = 20
                                                         
Backup pending                                          = = NO
                                                         
Database is consistent                                  = = NO
Rollforward pending                                     = = NO
Restore pending                                       = = NO
                                                         
Multi-page file allocation enabled                      = = NO
                                                         
Log retain for recovery status                        = = RECOVERY
User exit for logging status                            = = YES
                                                         
Data Links Token Expiry Interval (sec)      (DL_EXPINT) = = 60
Data Links Write Token Init Expiry Intvl(DL_WT_IEXPINT) = = 60
Data Links Number of Copies             (DL_NUM_COPIES) = = 1
Data Links Time after Drop (days)      (DL_TIME_DROP) = = 1
Data Links Token in Uppercase                (DL_UPPER) = = NO
Data Links Token Algorithm                   (DL_TOKEN) = = MAC0
                                                         
Database heap (4KB)                            (DBHEAP) = = 5000
Size of database shared memory (4KB)(DATABASE_MEMORY) = = AUTOMATIC
Catalog cache size (4KB)            (CATALOGCACHE_SZ) = = (MAXAPPLS*4
Log buffer size (4KB)                        (LOGBUFSZ) = = 512
Utilities heap size (4KB)                (UTIL_HEAP_SZ) = = 6000
Buffer pool size (pages)                     (BUFFPAGE) = = 1000
Extended storage segments size (4KB)    (ESTORE_SEG_SZ) = = 16000
Number of extended storage segments   (NUM_ESTORE_SEGS) = = 0
Max storage for lock list (4KB)            (LOCKLIST) = = 5000
                                                         
Max size of appl. group mem set (4KB) (APPGROUP_MEM_SZ) = = 30000
Percent of mem for appl. group heap   (GROUPHEAP_RATIO) = = 70
Max appl. control heap size (4KB)   (APP_CTL_HEAP_SZ) = = 512
                                                         
Sort heap thres for shared sorts (4KB) (SHEAPTHRES_SHR) = = (SHEAPTHRES
Sort list heap (4KB)                         (SORTHEAP) = = 4096
SQL statement heap (4KB)                     (STMTHEAP) = = 4096
Default application heap (4KB)             (APPLHEAPSZ) = = 10000
Package cache size (4KB)                   (PCKCACHESZ) = = (MAXAPPLS*8
Statistics heap size (4KB)               (STAT_HEAP_SZ) = = 10000
                                                         
Interval for checking deadlock (ms)         (DLCHKTIME) = = 180000
Percent. of lock lists per application       (MAXLOCKS) = = 10
Lock timeout (sec)                        (LOCKTIMEOUT) = = 720
                                                         
Changed pages threshold                (CHNGPGS_THRESH) = = 60
Number of asynchronous page cleaners   (NUM_IOCLEANERS) = = 6
Number of I/O servers                   (NUM_IOSERVERS) = = 8
Index sort flag                           (INDEXSORT) = = YES
Sequential detect flag                      (SEQDETECT) = = YES
Default prefetch size (pages)         (DFT_PREFETCH_SZ) = = 32
                                                         
Track modified pages                         (TRACKMOD) = = OFF
                                                         
Default number of containers                            = = 1
Default tablespace extentsize (pages)   (DFT_EXTENT_SZ) = = 32
                                                         
Max number of active applications            (MAXAPPLS) = = AUTOMATIC
Average number of active applications       (AVG_APPLS) = = 5
Max DB files open per application            (MAXFILOP) = = 1000
                                                         
Log file size (4KB)                         (LOGFILSIZ) = = 10000
Number of primary log files                (LOGPRIMARY) = = 5
Number of secondary log files               (LOGSECOND) = = 25
Changed path to log files                  (NEWLOGPATH) = =
Overflow log path                     (OVERFLOWLOGPATH) = =
Mirror log path                         (MIRRORLOGPATH) = =
First active log file                                 = = S0005266.LO
Block log on disk full                (BLK_LOG_DSK_FUL) = = NO
Percent of max active log space by transaction(MAX_LOG) = = 0
Num. of active log files for 1 active UOW(NUM_LOG_SPAN) = = 0
                                                         
Group commit count                        (MINCOMMIT) = = 1
Percent log file reclaimed before soft chckpt (SOFTMAX) = = 100
Log retain for recovery enabled             (LOGRETAIN) = = RECOVERY
User exit for logging enabled                (USEREXIT) = = ON
                                                         
Auto restart enabled                      (AUTORESTART) = = ON
Index re-creation time                     (INDEXREC) = = SYSTEM (RES
Default number of loadrec sessions    (DFT_LOADREC_SES) = = 1
Number of database backups to retain   (NUM_DB_BACKUPS) = = 12
Recovery history retention (days)   (REC_HIS_RETENTN) = = 366

[ 本帖最后由 doushi 于 2009-11-5 09:01 编辑 ]

onlywxw 发表于 2009-11-04 15:50

好久不写程序了,已经生疏了。。。
数据库不是可以使用dirtyread吗,这样就可以突破锁的问题了,但是这种操作要结合你的应用来分析是否可以使用,别读出来了垃圾数据造成不良后果

[ 本帖最后由 onlywxw 于 2009-11-4 15:51 编辑 ]

neverbackgo 发表于 2009-12-25 13:26

对于这个问题,要看Web程序虽然是读取但采用的那种方式,当然像二楼说的
采用UR隔离级别可以,读到数据但可能是不正确的结果。

如果想确定是否是死锁:

可以将db2 monitor打开
使用db2 get monitor switches   可以查看是否打开了监控器。
然后使用

db2 update monitor switches using lock on statement on
等语句将其开关打开。

使用 db2 get snapshot for locks on dbname 或是
       db2get snapshot for locks for application agentid appl-handler
其中 appl-handler 可从 db2 list applications all 中获得。

建议你的超时时间不要设置为720秒 ,应该缩短, 并且你的数据库参数死锁检测时间
应由原来三分钟更改为短些,方便您调试跟踪,查明问题后再调回。

另外可以使用时间检测器来捕获你的信息。

    个人建议,你清空表数据需要2分钟,时间过长,考虑是否需要在事物控制范围内,如不需要则
采用 import from 方式清空应该在瞬间就可以完成。这种锁应该就不存在了。具体的情况不了解,
只提供参考意见。
页: [1]
查看完整版本: DB2 死锁