shashank created CAMEL-26770:
--------------------------------

             Summary: camel-sql - JdbcCachedMessageIdRepository: a key added in 
a transaction that rolls back stays in the cache
                 Key: CAMEL-26770
                 URL: https://issues.apache.org/jira/browse/CAMEL-26770
             Project: Camel
          Issue Type: Bug
          Components: camel-sql
            Reporter: shashank
            Assignee: shashank


JdbcCachedMessageIdRepository.add puts the key in its in-memory cache as soon 
as super.add returns, before the transaction that inserted the row commits.

When the add joins a caller's transaction (a transacted route on the same 
DataSource transaction manager) and that transaction rolls back, the row is 
gone but the key stays in the cache. add() and contains() then answer from the 
cache, so the redelivery of the same message is rejected as a duplicate, 
although the database has no row for it.

CAMEL-24046 made add() cache the key only after the insert succeeded; this is 
the case where the insert succeeds but the caller's transaction then rolls back.

Found by Claus Ibsen while reviewing CAMEL-26743 (apache/camel#29437), where 
JdbcOrphanLockAwareIdempotentRepository had the same pattern for its keep-alive 
set; that PR now adds the key only after the commit (a 
TransactionSynchronization). The same approach would work here. (remove() and 
clear() empty the cache before their transaction commits, but a rolled-back 
remove only costs a cache miss, as contains() then reads the row.)

_Filed with Claude Code on behalf of allthingssecurity._



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to