[ 
https://issues.apache.org/jira/browse/CAY-2735?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17623205#comment-17623205
 ] 

Aliaksei Peraverzeu commented on CAY-2735:
------------------------------------------

h3. Summary

According to my research I have found out that when excludeFromTransaction mode 
is enabled we face the situation, when during first operation, in the first 
CommitLogListener, after first beforeCommit method we go thought and make a new 
cycle with the second operation with its own beforeCommit and afterCommit 
methods and only passed this inner cycle of the second operation we go to the 
first one and continue with afterCommit method for the first operation. 
h3. Illustration

With our two operation it looks like this:

Format: {{{}{methodName}\{numberOfMethod}{}}}, 1 is basic operation, 2 is 
postpersist one.

With excludeFromTransaction flag: before1 → before2 → after2 → after1
Without excludeFromTransaction flag: before1 → after1 → before2 → after2
h3. Solutions

As possible solution we need to manage the state of diff changes outside of 
Listeners.

> Missing events in CommitLogListener in "excludeFromTransaction" mode
> --------------------------------------------------------------------
>
>                 Key: CAY-2735
>                 URL: https://issues.apache.org/jira/browse/CAY-2735
>             Project: Cayenne
>          Issue Type: Bug
>    Affects Versions: 4.2.B1
>            Reporter: Andrus Adamchik
>            Priority: Minor
>             Fix For: 4.3.M1
>
>
> I have a Persistent object X with the following {{@PostPersist}} 
> {noformat}
> @PostPersist
> public void postPersist() {
>     setPropX(...calculation_based_on_id_);
>     getObjectContext().commitChanges();
> }
> {noformat}
> ... and a CommitLogListener in "excludeFromTransaction" mode, that needs to 
> see both the new object creation and "propX" change in the same 
> "onPostCommit" call:
> {noformat}
> CommitLogModule.extend()
>     .addListener(listener)
>     .excludeFromTransaction()
>     .module());
> {noformat}
> When I create and commit a new X,  it results in two commits in a single 
> transaction (one from the user code, and another one - from PostPersist), 
> with one INSERT and one UPDATE events respectively. But my "listener" only 
> receives the update and 2 unexpected ObjectId change events (with "null" 
> type). 
> Removing "excludeFromTransaction", results in the listener correctly 
> receiving first an INSERT and then an UPDATE events. But since those come as 
> separate "onPostCommit" calls, it is hard to match them and make sense of the 
> overall change. 
> While I can probably find a workaround for my case, we need to think how the 
> CommitLogFilter should behave when multiple operations occur in a single 
> transaction. Need a better change merge algorithm to present a transparent 
> "delta" across a bunch of operation. 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to