安装 WL 应用程序时“无法获得锁”

Posted

技术标签:

【中文标题】安装 WL 应用程序时“无法获得锁”【英文标题】:"A lock could not be obtained" when installing WL application 【发布时间】:2013-04-08 12:08:11 【问题描述】:

我在安装应用程序时遇到以下问题: 我正在使用 Worklight 控制台上传 .wlapp 文件,删除已部署的应用程序并尝试再次上传相同的 .wlapp。 Worklight 控制台随后卡住,甚至通常的服务器停止也无法完成。 在残酷地杀死服务器进程并重新启动它后,可以上传.wlapp。

安装的 Worklight Server 是带有 Derby/Liberty 的 v5.0.6 / v5.0.6.1 CE。

这是来自服务器的错误日志:

[4/8/13 14:43:02:586 IDT] 00000031 com.ibm.ws.logging.internal.impl.Incident I FFDC1015I:已创建 FFDC 事件:“java.sql.SQLTransactionRollbackException: A由于死锁而无法获得锁,锁和服务员的周期是: 锁:行,GADGET_APPLICATIONS,(2,7) 等待 XID:429,S,WORKLIGHT,SELECT t0.ID,t0.ENFORCE_AUTHENTICITY,t0.ENVIRONMENT_ID,t1.ID,t1.DISP_IN_GALLERY,t1.LAST_UPDATE_TIME,t1.NAME,t0.SERVER_VERSION,t0.VERSION,t0。来自 GADGET_APPLICATIONS 的 VERSION_LOCKED t0 INNER JOIN GADGETS t1 ON t0.GADGET_ID = t1.ID 授予 XID : 422, S 锁:行,GADGET_APPLICATIONS,(2,6) 等待 XID:422,X,WORKLIGHT,从 GADGET_APPLICATIONS 中删除 ID = ? 授予 XID : 422, S , 429, S .选定的受害者是 XID : 429. com.ibm.ws.rsadapter.jdbc.WSJdbcResultSet.next 2624" at ffdc_13.04.08_14.43.02.0.log [4/8/13 14:43:02:657 IDT] 00000031 com.worklight.gadgets.serving.InvokeProcServlet E FWLSE0081E: 从数据库同步应用程序失败。 org.springframework.orm.jpa.JpaOptimisticLockingFailureException: Unable to get an object lock on "A lock could not be obtained due to a deadlock, locks and waiters的循环是: 锁:行,GADGET_APPLICATIONS,(2,7) 等待 XID:429,S,WORKLIGHT,SELECT t0.ID,t0.ENFORCE_AUTHENTICITY,t0.ENVIRONMENT_ID,t1.ID,t1.DISP_IN_GALLERY,t1.LAST_UPDATE_TIME,t1.NAME,t0.SERVER_VERSION,t0.VERSION,t0。来自 GADGET_APPLICATIONS 的 VERSION_LOCKED t0 INNER JOIN GADGETS t1 ON t0.GADGET_ID = t1.ID 授予 XID : 422, S 锁:行,GADGET_APPLICATIONS,(2,6) 等待 XID:422,X,WORKLIGHT,从 GADGET_APPLICATIONS 中删除 ID = ? 授予 XID : 422, S , 429, S .选择的受害者是 XID : 429. [java.lang.String]".; 嵌套异常是 org.apache.openjpa.persistence.OptimisticLockException: Unable to get an object lock on "A lock could not be getting due to a deadlock,锁和服务员的循环是: 锁:行,GADGET_APPLICATIONS,(2,7) 等待 XID:429,S,WORKLIGHT,SELECT t0.ID,t0.ENFORCE_AUTHENTICITY,t0.ENVIRONMENT_ID,t1.ID,t1.DISP_IN_GALLERY,t1.LAST_UPDATE_TIME,t1.NAME,t0.SERVER_VERSION,t0.VERSION,t0。来自 GADGET_APPLICATIONS 的 VERSION_LOCKED t0 INNER JOIN GADGETS t1 ON t0.GADGET_ID = t1.ID 授予 XID : 422, S 锁:行,GADGET_APPLICATIONS,(2,6) 等待 XID:422,X,WORKLIGHT,从 GADGET_APPLICATIONS 中删除 ID = ? 授予 XID : 422, S , 429, S .选定的受害者是 XID : 429. [java.lang.String]"。 在 org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:285) 在 org.springframework.orm.jpa.DefaultJpaDialect.translateExceptionIfPossible(DefaultJpaDialect.java:120) 在 org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:212) 在 org.springframework.orm.jpa.JpaAccessor.translateIfNecessary(JpaAccessor.java:152) 在 org.springframework.orm.jpa.JpaTemplate.execute(JpaTemplate.java:189) 在 org.springframework.orm.jpa.JpaTemplate.executeFind(JpaTemplate.java:151) 在 org.springframework.orm.jpa.JpaTemplate.findByNamedQuery(JpaTemplate.java:343) 在 com.worklight.server.database.api.JpaDaoHelper.executeQuery(JpaDaoHelper.java:36) 在 com.worklight.gadgets.bean.GadgetDAO.getAllApplications(GadgetDAO.java:103) 在 com.worklight.gadgets.bean.WidgetServiceBean$ApplicationTransaction.getAppsToRemove(WidgetServiceBean.java:370) 在 com.worklight.gadgets.bean.WidgetServiceBean$ApplicationTransaction.syncApplicationsStateFromDB(WidgetServiceBean.java:286) 在 com.worklight.gadgets.bean.WidgetServiceBean$ClusterSyncApplicationTransaction.run(WidgetServiceBean.java:475) 在 com.worklight.gadgets.bean.WidgetServiceBean$ClusterSyncApplicationTransaction.run(WidgetServiceBean.java:470) 在 com.worklight.core.util.RssBrokerUtils.doInTransaction(RssBrokerUtils.java:119) 在 com.worklight.gadgets.bean.WidgetServiceBean.syncApplicationsFromDBTransaction(WidgetServiceBean.java:467) 在 com.worklight.gadgets.bean.ClusterDataSynchronizationTask.step(ClusterDataSynchronizationTask.java:33) 在 com.worklight.core.tasks.TaskThread.run(TaskThread.java:98) 引起:org.apache.openjpa.persistence.OptimisticLockException: Unable to get an object lock on "A lock could not be obtained due to a deadlock, locks and waiters的循环是: 锁:行,GADGET_APPLICATIONS,(2,7) 等待 XID:429,S,WORKLIGHT,SELECT t0.ID,t0.ENFORCE_AUTHENTICITY,t0.ENVIRONMENT_ID,t1.ID,t1.DISP_IN_GALLERY,t1.LAST_UPDATE_TIME,t1.NAME,t0.SERVER_VERSION,t0.VERSION,t0。来自 GADGET_APPLICATIONS 的 VERSION_LOCKED t0 INNER JOIN GADGETS t1 ON t0.GADGET_ID = t1.ID 授予 XID : 422, S 锁:行,GADGET_APPLICATIONS,(2,6) 等待 XID:422,X,WORKLIGHT,从 GADGET_APPLICATIONS 中删除 ID = ? 授予 XID : 422, S , 429, S .选定的受害者是 XID : 429. [java.lang.String]"。 在 org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4236) 在 org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4211) 在 org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:102) 在 org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:88) 在 org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:64) 在 org.apache.openjpa.jdbc.kernel.SelectResultObjectProvider.handleCheckedException(SelectResultObjectProvider.java:155) 在 org.apache.openjpa.lib.rop.EagerResultList.(EagerResultList.java:40) 在 org.apache.openjpa.kernel.QueryImpl.toResult(QueryImpl.java:1228) 在 org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:990) 在 org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:805) 在 org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:775) 在 org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:771) 在 org.apache.openjpa.kernel.DelegatingQuery.execute(DelegatingQuery.java:517) 在 org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:255) 在 org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:294) 在 org.springframework.orm.jpa.JpaTemplate$11.doInJpa(JpaTemplate.java:351) 在 org.springframework.orm.jpa.JpaTemplate.execute(JpaTemplate.java:184) ... 12 更多 引起:java.sql.SQLTransactionRollbackException:由于死锁而无法获得锁,锁和等待者的循环是: 锁:行,GADGET_APPLICATIONS,(2,7) 等待 XID:429,S,WORKLIGHT,SELECT t0.ID,t0.ENFORCE_AUTHENTICITY,t0.ENVIRONMENT_ID,t1.ID,t1.DISP_IN_GALLERY,t1.LAST_UPDATE_TIME,t1.NAME,t0.SERVER_VERSION,t0.VERSION,t0。来自 GADGET_APPLICATIONS 的 VERSION_LOCKED t0 INNER JOIN GADGETS t1 ON t0.GADGET_ID = t1.ID 授予 XID : 422, S 锁:行,GADGET_APPLICATIONS,(2,6) 等待 XID:422,X,WORKLIGHT,从 GADGET_APPLICATIONS 中删除 ID = ? 授予 XID : 422, S , 429, S .选择的受害者是 XID : 429。 在 org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(未知来源) 在 org.apache.derby.impl.jdbc.Util.generateCsSQLException(未知来源) 在 org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(未知来源) 在 org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(未知来源) 在 org.apache.derby.impl.jdbc.EmbedConnection.handleException(未知来源) 在 org.apache.derby.impl.jdbc.ConnectionChild.handleException(未知来源) 在 org.apache.derby.impl.jdbc.EmbedResultSet.closeOnTransactionError(未知来源) 在 org.apache.derby.impl.jdbc.EmbedResultSet.movePosition(未知来源) 在 org.apache.derby.impl.jdbc.EmbedResultSet.next(未知来源) 在 com.ibm.ws.rsadapter.jdbc.WSJdbcResultSet.next(WSJdbcResultSet.java:3108) 在 org.apache.openjpa.lib.jdbc.DelegatingResultSet.next(DelegatingResultSet.java:106) 在 org.apache.openjpa.jdbc.sql.ResultSetResult.nextInternal(ResultSetResult.java:222) 在 org.apache.openjpa.jdbc.sql.SelectImpl$SelectResult.nextInternal(SelectImpl.java:2470) 在 org.apache.openjpa.jdbc.sql.AbstractResult.next(AbstractResult.java:173) 在 org.apache.openjpa.jdbc.kernel.SelectResultObjectProvider.next(SelectResultObjectProvider.java:99) 在 org.apache.openjpa.lib.rop.EagerResultList.(EagerResultList.java:35) ... 22 更多 引起:java.sql.SQLException: A lock could not be getting due to a deadlock, locks and waiters的循环是: 锁:行,GADGET_APPLICATIONS,(2,7) 等待 XID:429,S,WORKLIGHT,SELECT t0.ID,t0.ENFORCE_AUTHENTICITY,t0.ENVIRONMENT_ID,t1.ID,t1.DISP_IN_GALLERY,t1.LAST_UPDATE_TIME,t1.NAME,t0.SERVER_VERSION,t0.VERSION,t0。来自 GADGET_APPLICATIONS 的 VERSION_LOCKED t0 INNER JOIN GADGETS t1 ON t0.GADGET_ID = t1.ID 授予 XID : 422, S 锁:行,GADGET_APPLICATIONS,(2,6) 等待 XID:422,X,WORKLIGHT,从 GADGET_APPLICATIONS 中删除 ID = ? 授予 XID : 422, S , 429, S .选择的受害者是 XID : 429。 在 org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(未知来源) 在 org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(未知来源) ... 38 更多 原因:ERROR 40001:由于死锁而无法获得锁,锁和等待者的周期为: 锁:行,GADGET_APPLICATIONS,(2,7) 等待 XID:429,S,WORKLIGHT,SELECT t0.ID,t0.ENFORCE_AUTHENTICITY,t0.ENVIRONMENT_ID,t1.ID,t1.DISP_IN_GALLERY,t1.LAST_UPDATE_TIME,t1.NAME,t0.SERVER_VERSION,t0.VERSION,t0。来自 GADGET_APPLICATIONS 的 VERSION_LOCKED t0 INNER JOIN GADGETS t1 ON t0.GADGET_ID = t1.ID 授予 XID : 422, S 锁:行,GADGET_APPLICATIONS,(2,6) 等待 XID:422,X,WORKLIGHT,从 GADGET_APPLICATIONS 中删除 ID = ? 授予 XID : 422, S , 429, S .选择的受害者是 XID : 429。 在 org.apache.derby.iapi.error.StandardException.newException(未知来源) 在 org.apache.derby.impl.services.locks.Deadlock.buildException(未知来源) 在 org.apache.derby.impl.services.locks.ConcurrentLockSet.lockObject(未知来源) 在 org.apache.derby.impl.services.locks.AbstractPool.lockObject(未知来源) 在 org.apache.derby.impl.services.locks.ConcurrentPool.lockObject(未知来源) 在 org.apache.derby.impl.store.raw.xact.RowLocking3.lockRecordForRead(未知来源) 在 org.apache.derby.impl.store.access.heap.HeapController.lockRow(未知来源) 在 org.apache.derby.impl.store.access.heap.HeapController.lockRow(未知来源) 在 org.apache.derby.impl.store.access.btree.index.B2IRowLocking3.lockRowOnPage(未知来源) 在 org.apache.derby.impl.store.access.btree.index.B2IRowLocking3._lockScanRow(未知来源) 在 org.apache.derby.impl.store.access.btree.index.B2IRowLockingRR.lockScanRow(未知来源) 在 org.apache.derby.impl.store.access.btree.BTreeForwardScan.fetchRows(未知来源) 在 org.apache.derby.impl.store.access.btree.BTreeScan.fetchNextGroup(未知来源) 在 org.apache.derby.impl.sql.execute.BulkTableScanResultSet.reloadArray(未知来源) 在 org.apache.derby.impl.sql.execute.BulkTableScanResultSet.getNextRowCore(未知来源) 在 org.apache.derby.impl.sql.execute.IndexRowToBaseRowResultSet.getNextRowCore(未知来源) 在 org.apache.derby.impl.sql.execute.NestedLoopJoinResultSet.getNextRowCore(未知来源) 在 org.apache.derby.impl.sql.execute.ProjectRestrictResultSet.getNextRowCore(未知来源) 在 org.apache.derby.impl.sql.execute.BasicNoPutResultSetImpl.getNextRow(未知来源) ... 31 更多

【问题讨论】:

【参考方案1】:

这可以通过将以下属性添加到 server.xml 中的 WorklightDS dataSource 元素来解决:

isolationLevel="TRANSACTION_READ_COMMITTED"

【讨论】:

以上是关于安装 WL 应用程序时“无法获得锁”的主要内容,如果未能解决你的问题,请参考以下文章

解决Ubuntu 无法获得锁 /var/lib/dpkg/lock -open (11...

linux系统 在安装jdk时总是出现E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) 怎么办

无法获得锁 /var/lib/dpkg/lock - open (11: 资源临时不可用)

Linux apt下载安装时出现:在等待缓存锁:无法获得锁 /var/lib/dpkg/lock-frontend的问题

Linux apt下载安装时出现:在等待缓存锁:无法获得锁 /var/lib/dpkg/lock-frontend的问题

Linux apt下载安装时出现:在等待缓存锁:无法获得锁 /var/lib/dpkg/lock-frontend的问题