So here is what I am doing...
- Initially Session starts off with a null CacheTransactionContext
- I created a new method org.hibernate.resource.transaction.spi.TransactionCoordinatorOwner#startTransactionBoundary which calls another new method org.hibernate.resource.jdbc.spi.JdbcSessionOwner#startTransactionBoundary. Session (as a JdbcSessionOwner implementor) uses this trigger as an indication that it has just become part of a transaction (JDBC or JTA, see below) and I use that to ask the RegionFactory for its CacheTransactionContext. It is an important distinction here that org.hibernate.resource.transaction.spi.TransactionCoordinatorOwner#afterTransactionBegin not be used here. #afterTransactionBegin is intended to be the signal when a transaction is started via the Hibernate org.hibernate.Transaction API.
- This new method is called from both (a) JdbcResourceLocalTransactionCoordinatorImpl#afterBeginCallback and (b) JtaTransactionCoordinatorImpl#joinJtaTransaction
- Calls to various "transactional" methods of Region and its access-objects will pass along this CacheTransactionContext rather than Session itself. The cache impl is free to stash the Session on the CacheTransactionContext that it is passed when generating that CacheTransactionContext if it needs access to it later
- These calls may be passed a null CacheTransactionContext which would be the case when the Session is not part of a transaction
|