当前位置: 代码迷 >> 其他数据库 >> 关于Derby的死锁。解决思路
  详细解决方案

关于Derby的死锁。解决思路

热度:4687   发布时间:2013-02-26 00:00:00.0
关于Derby的死锁。
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,看是不是显式事务,隐式事务的问题