You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@isis.apache.org by "Dan Haywood (JIRA)" <ji...@apache.org> on 2013/10/17 11:59:43 UTC
[jira] [Commented] (ISIS-566) Concurrency conflict on related
entity that has not been edited
[ https://issues.apache.org/jira/browse/ISIS-566?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13797745#comment-13797745 ]
Dan Haywood commented on ISIS-566:
----------------------------------
Root cause:
- when clicking edit, we load the target object (Party) and some related objects - including the bank account) are also loaded in (see annotated stack trace below).
in the frameworksynchronizer, we do the check on the version of the loaded object; bank account in this case.
It seems that JDO has assigned a new version to the BankAccount, even though it was never updated. But the reason it seems to have done this is that both BankAccount and its superclass, FinancialAccount, have @Version as an annotation. Both, in turn, have a column in their respective tables in the database. And, they are out of sync.
This clearly isn't right; there shouldn't be a version number on the subtype table (or, if it were there, then it should always be in sync with that of the supertype table).
Removing the @Version annotation on the BankAccount, the error went away.
To prevent this mistake from occurring on other tables, I think the fix is to add a new MetaModelValidator to detect any cases when @Version has been added incorrectly to a subtype where the supertype also has an @Version annotation.
~~~
>> this is loading of the BankAccount
RootOidDefault.<init>(ObjectSpecId, String, Oid$State, Version) line: 136
RootOidDefault.<init>(ObjectSpecId, String, Oid$State) line: 96
OidGenerator.createPersistentOrViewModelOid(Object, RootOid) line: 106
>> callback from JDO
FrameworkSynchronizer$1.run() line: 107
FrameworkSynchronizer$7.call() line: 285
FrameworkSynchronizer$7.call() line: 1
FrameworkSynchronizer.withLogging(PersistenceCapable, Callable<T>, CalledFrom) line: 270
FrameworkSynchronizer.withLogging(PersistenceCapable, Runnable, FrameworkSynchronizer$CalledFrom) line: 281
FrameworkSynchronizer.postLoadProcessingFor(PersistenceCapable, FrameworkSynchronizer$CalledFrom) line: 69
PersistenceQueryFindAllInstancesProcessor(PersistenceQueryProcessorAbstract<T>).loadAdapters(ObjectSpecification, List<?>) line: 82
PersistenceQueryFindAllInstancesProcessor.process(PersistenceQueryFindAllInstances) line: 54
PersistenceQueryFindAllInstancesProcessor.process(PersistenceQuery) line: 1
DataNucleusObjectStore.processPersistenceQuery(PersistenceQueryProcessor<Q>, PersistenceQuery) line: 542
DataNucleusObjectStore.loadInstancesAndAdapt(PersistenceQuery) line: 537
PersistenceSession$1.execute() line: 461
PersistenceSession$1.execute() line: 1
IsisTransactionManager.executeWithinTransaction(TransactionalClosureWithReturn<Q>) line: 217
PersistenceSession.getInstancesFromPersistenceLayer(PersistenceQuery) line: 458
PersistenceSession.getInstances(PersistenceQuery) line: 454
PersistenceSession.findInstances(PersistenceQuery) line: 391
PersistenceSession.findInstances(Query<T>, QueryCardinality) line: 386
RuntimeContextFromSession$8.allMatchingQuery(Query<T>) line: 260
DomainObjectContainerDefault.allMatches(Query<T>) line: 400
DomainObjectContainerDefault.allInstances(Class<T>, long...) line: 361
DomainObjectContainerDefault.allMatches(Class<T>, Predicate<? super T>, long...) line: 370
DomainObjectContainerDefault.allMatches(Class<T>, Filter<? super T>, long...) line: 383
FinancialAccountContributions(AbstractContainedObject).allMatches(Class<T>, Filter<? super T>, long...) line: 148
>> resolving of the contributed collection
FinancialAccountContributions.financialAccounts(Party) line: 53
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: not available
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: not available
Method.invoke(Object, Object...) line: not available
ActionInvocationFacetViaMethod.invoke(ObjectAdapter, ObjectAdapter[]) line: 111
ActionInvocationFacetWrapTransaction$1.execute() line: 56
ActionInvocationFacetWrapTransaction$1.execute() line: 1
IsisTransactionManager.executeWithinTransaction(TransactionalClosureWithReturn<Q>) line: 217
ActionInvocationFacetWrapTransaction.invoke(ObjectAdapter, ObjectAdapter[]) line: 53
ObjectActionImpl.execute(ObjectAdapter, ObjectAdapter[]) line: 345
>> rendering of the financialAccounts collection
OneToManyAssociationContributee.get(ObjectAdapter) line: 106
EntityCollectionModel$Type$2.load(EntityCollectionModel) line: 99
EntityCollectionModel.load() line: 299
EntityCollectionModel.load() line: 1
EntityCollectionModel(LoadableDetachableModel<T>).getObject() line: 121
CollectionContentsSortableDataProvider.size() line: 65
DataTable$1(DataViewBase<T>).internalGetItemCount() line: 142
DataTable$1(AbstractPageableView<T>).getItemCount() line: 235
DataTable$1(AbstractPageableView<T>).getRowCount() line: 216
DataTable$1(AbstractPageableView<T>).getViewSize() line: 314
DataTable$1(AbstractPageableView<T>).getItemModels() line: 99
DataTable$1(RefreshingView<T>).onPopulate() line: 93
DataTable$1(AbstractRepeater).onBeforeRender() line: 116
DataTable$1(AbstractPageableView<T>).onBeforeRender() line: 115
DataTable$1(Component).internalBeforeRender() line: 923
DataTable$1(Component).beforeRender() line: 991
WebMarkupContainer(MarkupContainer).onBeforeRenderChildren() line: 1681
WebMarkupContainer(Component).onBeforeRender() line: 3844
WebMarkupContainer(Component).internalBeforeRender() line: 923
WebMarkupContainer(Component).beforeRender() line: 991
IsisAjaxFallbackDataTable<T,S>(MarkupContainer).onBeforeRenderChildren() line: 1681
IsisAjaxFallbackDataTable<T,S>(Component).onBeforeRender() line: 3844
IsisAjaxFallbackDataTable<T,S>(Component).internalBeforeRender() line: 923
IsisAjaxFallbackDataTable<T,S>(Component).beforeRender() line: 991
CollectionContentsAsAjaxTablePanel(MarkupContainer).onBeforeRenderChildren() line: 1681
CollectionContentsAsAjaxTablePanel(Component).onBeforeRender() line: 3844
CollectionContentsAsAjaxTablePanel(Component).internalBeforeRender() line: 923
CollectionContentsAsAjaxTablePanel(Component).beforeRender() line: 991
CollectionContentsLinksSelectorPanel(MarkupContainer).onBeforeRenderChildren() line: 1681
CollectionContentsLinksSelectorPanel(Component).onBeforeRender() line: 3844
CollectionContentsLinksSelectorPanel(Component).internalBeforeRender() line: 923
CollectionContentsLinksSelectorPanel(Component).beforeRender() line: 991
WebMarkupContainer(MarkupContainer).onBeforeRenderChildren() line: 1681
WebMarkupContainer(Component).onBeforeRender() line: 3844
WebMarkupContainer(Component).internalBeforeRender() line: 923
WebMarkupContainer(Component).beforeRender() line: 991
>>> the UI for the financialAccounts collection
CollectionPanel(MarkupContainer).onBeforeRenderChildren() line: 1681
CollectionPanel(Component).onBeforeRender() line: 3844
CollectionPanel(Component).internalBeforeRender() line: 923
CollectionPanel(Component).beforeRender() line: 991
WebMarkupContainer(MarkupContainer).onBeforeRenderChildren() line: 1681
WebMarkupContainer(Component).onBeforeRender() line: 3844
WebMarkupContainer(Component).internalBeforeRender() line: 923
WebMarkupContainer(Component).beforeRender() line: 991
WebMarkupContainer(MarkupContainer).onBeforeRenderChildren() line: 1681
WebMarkupContainer(Component).onBeforeRender() line: 3844
WebMarkupContainer(Component).internalBeforeRender() line: 923
WebMarkupContainer(Component).beforeRender() line: 991
RepeatingView(MarkupContainer).onBeforeRenderChildren() line: 1681
RepeatingView(Component).onBeforeRender() line: 3844
RepeatingView(AbstractRepeater).onBeforeRender() line: 136
RepeatingView(Component).internalBeforeRender() line: 923
RepeatingView(Component).beforeRender() line: 991
EntityCollectionsPanel(MarkupContainer).onBeforeRenderChildren() line: 1681
EntityCollectionsPanel(Component).onBeforeRender() line: 3844
EntityCollectionsPanel(Component).internalBeforeRender() line: 923
EntityCollectionsPanel(Component).beforeRender() line: 991
EntityPropertiesForm(MarkupContainer).onBeforeRenderChildren() line: 1681
EntityPropertiesForm(Component).onBeforeRender() line: 3844
EntityPropertiesForm(Form<T>).onBeforeRender() line: 1743
EntityPropertiesForm(Component).internalBeforeRender() line: 923
EntityPropertiesForm(Component).beforeRender() line: 991
EntityPropertiesPanel(MarkupContainer).onBeforeRenderChildren() line: 1681
EntityPropertiesPanel(Component).onBeforeRender() line: 3844
EntityPropertiesPanel(Component).internalBeforeRender() line: 923
EntityPropertiesPanel(Component).beforeRender() line: 991
EntityCombinedPanel(MarkupContainer).onBeforeRenderChildren() line: 1681
EntityCombinedPanel(Component).onBeforeRender() line: 3844
EntityCombinedPanel(Component).internalBeforeRender() line: 923
EntityCombinedPanel(Component).beforeRender() line: 991
EntityLinksSelectorPanel(MarkupContainer).onBeforeRenderChildren() line: 1681
EntityLinksSelectorPanel(Component).onBeforeRender() line: 3844
EntityLinksSelectorPanel(Component).internalBeforeRender() line: 923
EntityLinksSelectorPanel(Component).beforeRender() line: 991
EntityPage(MarkupContainer).onBeforeRenderChildren() line: 1681
EntityPage(Component).onBeforeRender() line: 3844
EntityPage(Page).onBeforeRender() line: 798
EntityPage.onBeforeRender() line: 86
EntityPage(Component).internalBeforeRender() line: 923
EntityPage(Component).beforeRender() line: 991
EntityPage(Component).internalPrepareForRender(boolean) line: 2214
EntityPage(Page).internalPrepareForRender(boolean) line: 241
EntityPage(Component).render() line: 2303
EntityPage(Page).renderPage() line: 1010
> Concurrency conflict on related entity that has not been edited
> ---------------------------------------------------------------
>
> Key: ISIS-566
> URL: https://issues.apache.org/jira/browse/ISIS-566
> Project: Isis
> Issue Type: Bug
> Reporter: Jeroen van der Wal
> Assignee: Dan Haywood
> Priority: Critical
> Fix For: core-1.3.0
>
>
> This can be reproduced as follows:
> - load the Estatio demo fixture
> - Parties>allParties
> - select first party
> - unlock
> - choose edit
> ... and a concurrency exception on BankAccount (contributed collection on Party via FinancialAccountContributions#financialAccounts()) is thrown:
> Another user has just changed this data
> root attempted to update org.estatio.dom.financial.BankAccount:L_0, however this object has since been modified by root at Wed Oct 16 08:56:44 GMT 2013 [2 vs 1]
--
This message was sent by Atlassian JIRA
(v6.1#6144)