java下 多线程同时操作 derby数据库的2张表。 都发生了死锁。类似如下
org.springframework.dao.DeadlockLoserDataAccessException: PreparedStatementCallback; SQL [insert into smSendToOuter(mscid,smcid,dsc_code,dpc,stcs,opc,cdpn,cgpn,cont,keywordId,direction,interceptTime,freqCount)values(?,?,?,?,?,?,?,?,?,?,?,?,?)]; A lock could not be obtained due to a deadlock, cycle of locks and waiters is:
Lock : TABLE, SMSENDTOOUTER, Tablelock
Waiting XID : {139630012, IX} , APP, insert into smSendToOuter(mscid,smcid,dsc_code,dpc,stcs,opc,cdpn,cgpn,cont,keywordId,direction,interceptTime,freqCount)values(?,?,?,?,?,?,?,?,?,?,?,?,?)
Granted XID : {139630004, X}
Lock : ROW, SYSCONGLOMERATES, (5,7)
Waiting XID : {139630004, X} , APP, alter table "APP"."SMSENDTOOUTER" compress
Granted XID : {139630004, S} , {139630012, S}
按照我的理解。死锁应该发生在事物a 拥有资源 i 等待资源j 事物b拥有j等待i 类似这种情况发生。
而我的程序 没有显示的声明事物。。。 对2张表的操作仅有 select update delete 。 这样的话,锁应该仅仅发生在一次增删改中。 完成后立刻释放。 没有事物的概念呀。。。。 怎么会有死锁,。请指点!!
还有delete的时候 用到了 template.getJdbcOperations().execute(
"CALL SYSCS_UTIL.SYSCS_DISABLE_LOG_ARCHIVE_MODE(1)");
template.getJdbcOperations().execute(
"CALL SYSCS_UTIL.SYSCS_CHECKPOINT_DATABASE()");
template
.getJdbcOperations()
.execute(
"CALL SYSCS_UTIL.SYSCS_COMPRESS_TABLE('APP','BLOCKEDSMSCACHE', 0)");
这个应该是死锁的原因。 但是为什么执行他们会死锁呢?
------解决方案--------------------------------------------------------
不懂derby,看是不是显式事务,隐式事务的问题