解决协作死锁

死锁是这样一种情况,在该情况下两个或更多进程由于每一个进程都在等待其它进程进行而不能继续。死锁是协作内部因事件隔离而造成的并发性控制的副作用。有关事件隔离的更多信息,请参阅 Collaboration Development Guide

图 77 举例说明由于以下事件序列引起的两个活动的协作组之间的死锁:

  1. 在时间 T1,协作 A1 接收到一个事件 E1,然后对协作 B2 进行服务调用并发送 E1 的子业务对象。协作 A1 等待服务调用完成。
  2. 在时间 T2,协作 B1 接收到一个事件 E2,然后对协作 A2 进行服务调用并发送 E2 的子业务对象。协作 A2 等待服务调用完成。
  3. 在时间 T3,因为协作 B2 和 B1 具有相同端口绑定,并且在 B2 的事件到达之前已经传递来自 B1 的事件,所以 B2 将一直等待 B1。
  4. 在时间 T4,因为协作 A2 和 A1 具有相同端口绑定,并且在 B1 的事件到达之前已经传递来自 A1 的事件,所以 A2 将一直等待协作 A1。

此时,所有协作都不能向前移。

注:
端口绑定由业务对象类型和连接器名称组成。有关端口绑定的更多信息,请参阅 Collaboration Development Guide

图 77. 协作组之间的死锁


本节包括以下主题:

"检测协作死锁的步骤"

"检测组协作死锁的步骤"

"改正协作死锁的步骤"

检测协作死锁的步骤

缺省情况下,当启动 InterChange Server Express 时,InterChange Server Express 系统自动执行死锁检测。然而,当执行死锁检测时,如果协作组包含多个协作对象,则由于 InterChange Server Express 必须遍历组中的所有协作对象才能确定组中是否存在死锁,所以会延迟启动 InterChange Server Express。即使当死锁不存在时,这也会导致减慢启动速度。

可以将 InterChange Server Express 系统配置为不执行死锁检测。如果这样做,则系统将启动协作组,而不会首先检查死锁。这可以使 InterChange Server Express 有可能更快地引导。然而,如果不执行死锁检测而死锁存在,则以后发送至协作的事件可能失败。

系统管理器不提供设置 DEADLOCK_DETECTOR_CHECK 配置参数的能力。相反,要设置此配置参数,必须编辑 InterchangeSystem.cfg 文件并在此文件中更改该参数的值。

执行下列步骤来配置 InterChange Server Express 系统以进行死锁检测:

  1. 打开 InterchangeSystem.cfg 文件。下列各行定义文件中的 DEADLOCK_DETECTOR_CHECK 参数:

    <tns:name>DEADLOCK_DETECTOR_CHECK</tns:name>

    <tns:value xml:space="preserve">false</tns:name>

  2. 如果要执行死锁检测,将 false 值更改为 true
  3. 如果您不想执行死锁检测,则将值更改为 false

检测组协作死锁的步骤

执行下列其中一个步骤来检查组协作死锁:

改正协作死锁的步骤

执行以下步骤来改正协作死锁:

  1. 平稳地关闭所有其它协作。
  2. 立即关闭服务器。有关关闭 InterChange Server Express 系统的更多信息,请参阅"关闭 InterChange Server Express"
  3. 重新启动系统。在系统重新启动时,导致死锁的已停止协作自动启动并重新预订它支持的所有业务对象。将重新传递导致协作进入死锁的业务对象。因为死锁是定时的,所以防止了协作进入另一个死锁的情况。您的服务器负载和隔离顺序不太可能与系统遇到死锁时的服务器负载和隔离顺序相同。
  4. 在重新启动系统之后,关闭调用的协作并重新绑定端口,以便不再发生此死锁。

防止协作死锁的步骤

通过在系统管理器的服务器配置屏幕的“数据库”选项卡中配置死锁重试设置,可以防止协作死锁。

执行下列步骤来配置死锁重试机制:

  1. 在系统管理器中,在“InterChange Server 组件管理”视图中右键单击服务器并单击编辑配置。“系统管理器”窗口的右上部分变成一个工具,您可以在其中编辑 InterchangeSystem.cfg 文件。
  2. 单击数据库选项卡。一个对话框出现在“系统管理器”窗口的右上部分,在该窗口中,您可以输入在系统级别配置数据库配置所必需的参数(请参阅图 78)。

    图 78. “编辑配置”屏幕,“数据库”选项卡


  3. 最大数据库重试次数字段中,输入一个数字,该数字表示发生死锁时您希望服务器执行的最大重试次数。
  4. 死锁重试时间间隔字段中,输入一个数字,该数字表示在重试之前您希望系统等待的秒数。

Copyright IBM Corp. 2004