对 JPA 死锁和事务超时进行故障诊断
数据库死锁和事务超时是尝试访问同一数据库资源的两个或更多客户机之间争用的结果。死锁是一种特殊情况:两个或更多客户机之间发生循环阻塞条件,每个客户机被另一客户机阻塞,但是没有任何客户机可以继续。通常,这些现象不是编程错误。它们是由以复杂和相互依靠的方式访问数据库资源的业务逻辑造成的。
关于此任务
可以使用以下最佳实践和策略来最小化这些情况。
过程
- 标识导致此错误的受影响数据库资源。
- 在发生错误时检查异常(如有)可以使您获得造成故障情况的故障实体的线索。
- 如果使用了 WebSphere® Application Server 缺省 JPA 提供程序,那么您可以对 EclipseLink 应用程序启用产品跟踪组“eclipselink.logging.level.sql”或对 OpenJPA 应用程序启用“openjpa.jdbc.SQL=all”来收集所涉及的数据库资源的 SQL 语句和线程信息。 您可以整理信息来查明哪些客户机和实体是导致故障情况的工件。
- 对于更复杂的使用方案,您可以参考数据库文档以获取可以有助于标识导致数据争用问题的对象和事务的任何专门化工具或技术。
- 在明确了问题时,检查使用这些资源的业务逻辑以确定其使用不会导致任何争用延长。 没有用于解决死锁和超时问题的规定解决方案。其高度依赖于业务逻辑和实体关系的复杂性。
用于解决死锁和超时的基本概念是最小化保留超过必须时间的资源的时间,并允许其他客户机访问同一资源。如果争用无可避免,那么应用程序必须确定在发生这些故障情况时的恢复方式。以下策略可能有助于最小化问题情况并确定您是否可以应用一个或多个方式来解决该问题:
- 确保业务逻辑没有锁定超过必需量的实体。 很可能为只读的 JPA 应用程序应该使用缺省情况下由 JPA 提供的乐观锁定语义。JPA 2.0 引入悲观锁定功能,其允许应用程序显式按需求悲观锁定实体。您应该优化任何时候应用的悲观锁定数量。 过度锁定会增大死锁和超时的几率,使应用程序并行和吞吐量降级。
- 避免将数据源连接隔离级别设置为超过其所需的限制度。 隔离级别具有悲观锁定语义在连接级别产生的相同效果。JPA 需要最少量的“读落实”隔离级别来实现基本数据完整性目标。WebSphere Application Server 连接管理器缺省隔离级别是特定于数据库的。请参阅“编程接口”主题以了解 JDBCConnectionSpec API 规范信息。
- 最小化任何活动事务的持续时间。 延长的活动事务可能留置其他客户机所需的资源。一旦任何事务完成了所有资源,就将其落实。
- 优化业务逻辑以避免实体相互依赖。 如果两组业务逻辑使用相似资源,请考虑按相同顺序更新资源以避免出现典型的死锁循环依赖关系。这取决于使用的隔离级别。 它具有与将隐式锁定应用于资源相同的效果,如下一策略中所述。
- 使用悲观锁定来同步对公共资源的并行存取。 先前的策略不适用于您的情况时,悲观锁定是同步访问不同并发客户机使用的公共资源的备选方法。应用程序可以使用 JPA 2.0 悲观锁定功能来阻止其他客户机访问公共资源,直到事务落实或回滚为止。增加悲观锁定的使用会影响并行性和吞吐量。WebSphere Application Server JPA Access Intent 还提供基于 EJB 调用或用户定义的任务名称锁定数据资源的另一备选方法。
- 处理并从死锁和超时异常恢复。 大多数数据库服务器具有内置死锁预防机制。 它检测到死锁情况时,数据库使用的典型策略是取消某个请求而让另一请求成功。但是,终止的请求是特定于数据库而非决定性的。如果应用程序允许,那么良好实践是恢复死锁情况,然后尝试重试操作。


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tejb_jpadeadlock
文件名:tejb_jpadeadlock.html