本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
异常处理和重试
当由于无法解决的冲突或锁定等待超时而取消事务时,Amazon Neptune 将使用 ConcurrentModificationException
进行响应。有关更多信息,请参阅 引擎错误代码。作为最佳实践,客户端应始终捕获并处理这些异常。
在许多情况下,当 ConcurrentModificationException
实例数量很少时,基于指数回退的重试机制能够很好地处理它们。在这种重试方法中,最大重试次数和等待时间通常取决于事务的最大大小和持续时间。
但是,如果您的应用程序具有很高的并发更新工作负载,并且您观察到大量 ConcurrentModificationException
事件,则可以修改应用程序来减少冲突性并发修改的数量。
例如,请考虑这样的应用程序:它经常对一组顶点进行更新,并使用多个并发线程进行更新来优化写入吞吐量。如果每个线程连续执行更新一个或多个节点属性的查询,则并发更新同一节点可能会产生 ConcurrentModificationException
。这反过来会降低写入性能。
如果您能够将可能相互冲突的更新更改为顺序执行,则可大大降低发生此类冲突的可能性。例如,如果您可以确保对给定节点的所有更新查询都在同一线程上进行(例如使用基于哈希的分配),则可以确保它们一个接一个地执行,而不是并发执行。虽然对相邻节点进行范围锁定仍然可能导致 ConcurrentModificationException
,但是您消除了对同一节点的并发更新。