【发布时间】:2015-12-04 19:55:54
【问题描述】:
背景
Alfresco 使用默认的数据库事务隔离,对于我们的 Oracle 数据库,它是 READ_COMMITED。我正在从事一个项目,其中不可重复和幻读可能是一个主要问题,因此我正在考虑使用 SERIALIZABLE 事务隔离来避免这种情况。
一方面,我们将有一个自定义 API 服务,它将更改分组为原子事务 - 基本上是对文档的 CRUD 操作。 另一方面,我们将让后台进程并行运行更新此文档的元数据。
这些操作将使用事务元数据查询,以免通过将最终一致的 SOLR 查询添加到组合中而使事情进一步复杂化。
目标是能够在 API 服务运行时进行主要的元数据模型迁移。出于这个问题的目的,我将使用一个属性作为示例,但是 IRL 会有很多此类更改。例如,我们目前有一个带有约束的元数据字段:mymodel:doctypes1。但是我们需要将 mymodel:doctypes1 中的值重新映射到具有不同约束的新字段:mymodel:doctypes2。 (不要问我为什么,我无法控制这个决定,我个人质疑这种改变的智慧)。
我对 READ_COMMITTED 隔离的理解告诉我,在这种情况下,我们很容易受到以下情况的影响:
- 后台进程启动事务并读取 我的模型:doctypes1。
- API 将更改写入 mymodel:doctypes1 在后台进程提交之前。
- 后台进程更新值 mymodel:doctypes2 基于 mymodel:doctypes1 的原始值。
这两个值现在不一致了:我相信这个错误被称为不可重复读取。
问题
将 Oracle 数据库设置为 SERIALIZABLE 会阻止此问题吗? Alfresco 在后台使用 Spring 事务。我的理解是,使用 Spring 事务的可序列化 tx 隔离将防止这个问题“透明地”发生。
有没有人有任何将 Alfresco 数据库设置为 SERIALIZABLE 的实际经验?您是否试图解决类似的问题?它奏效了吗?它对您产生了什么样的性能影响?
非常感谢您分享您的经验!
【问题讨论】:
-
如果您将 Oracle 与 Alfresco 结合使用,那么您使用的是付费的 Alfresco One Enterprise。这意味着您会得到支持 - 只需给他们打个电话/提出一张票,他们就会让您与少数真正了解这些东西的 Alfresco 工程师取得联系!
标签: spring transactions alfresco