Ahhhh, Hibernate Search has the same problem but I could not pin point the 
issue.
Can you point me to the temp patch approach you're using.

On 10 juil. 2010, at 10:05, Adam Warski wrote:

> Hello,
> 
> because the thread is a bit old a small reminder what it was about:
> Envers used TX Synchronizations to write the audit data to a database, before 
> the transaction completed. However, exceptions thrown during a 
> synchronization are "eaten" (JDBCTransaction:274). The solution then was to 
> use, instead of a Synchronization, a BeforeTransactionCompletionProcess.
> 
> This, however, as it turns out, causes big problems in a JTA environment 
> (with resource-local txs all works fine): audit records are sometimes not 
> written. This is because the before tx completion process is called before tx 
> synchronizations, and in JTA the auto-flush at the end of a session is done 
> using a TX synchronization (AbstractEntityManagerImpl:1020). And it doesn't 
> look like exceptions are eaten when thrown from a synchronization in JTA - 
> otherwise any exception that occurred during a flush would go unnoticed (and 
> I know from practice this doesn't happen ;) ).
> 
> So isn't this inconsistent? Shouldn't the exceptions in JDBCTransaction be 
> rethrown as well?
> 
> For now a fix is to register both a BTCP and a TX Sync to write the audit 
> records, but I'd say it's rather a temporary patch :)
> 
> On Mar 31, 2010, at 1:00 PM, Adam Warski wrote:
> 
>> 
>>> In an ideal world, a Synchronization should swallow exceptions (or do 
>>> whatever it wants with it) if the exception should not tamper with the main 
>>> Hibernate execution. In a word, Synchronization would be in control. It has 
>>> my preference but It's a change of semantic.
>> 
>> Then maybe do as Steve suggested, either:
>> - introduce a new method to Synchronization (that would break existing 
>> synchronizations)
>> or
>> - introduce a new interface SynchronizationRollback which can be optionally 
>> implemented by the synchronization method
>> Then in JDBC transaction we could do:
>> 
>> if ((sync instanceof SynchronizationRollback) && ((SynchronizationRollback) 
>> sync).shouldRollback(exception) { // rollback }
>> 
>> -- 
>> Adam Warski
>> http://www.warski.org
>> http://www.softwaremill.eu
>> 
>> 
>> 
>> 
>> 
>> _______________________________________________
>> hibernate-dev mailing list
>> hibernate-dev@lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/hibernate-dev
> 
> -- 
> Adam Warski
> http://www.warski.org
> http://www.softwaremill.eu
> 
> 
> 
> 
> 
> _______________________________________________
> hibernate-dev mailing list
> hibernate-dev@lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/hibernate-dev


_______________________________________________
hibernate-dev mailing list
hibernate-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/hibernate-dev

Reply via email to