Cross-engine transaction detection in Hibernate v3+
In which I note a Lucee-compatible, ACF-compatible, Hibernate v3-v5.x method for detecting whether the current code block is inside a transaction.
UPDATE: Now with Adobe support!
So, this is embarrassing. This article claimed to offer a one-liner with Adobe and Lucee compatibility, but I completely neglected to actually test it on ACF before I wrote the blog post. (I thought I'd tested it... evidently not.) I realized this week after attempting to use my "cross-compatible" transaction detection code that it's not cross-compatible at all!
Bottom line: I updated the article with a properly-tested, fully cross-engine-compatible snippet to detect transactional context on both Adobe CF and Lucee. You're welcome.
We do a lot of ORM work at Ortus, and recently I have been on a bit of a Hibernate binge. One of the important things to note when working with Hibernate is that ORM queries may behave differently inside a transaction block than they do outside a transaction block. More importantly, the transactional handling in, say, Lucee 5.3 begins to break down when working with nested transactions.
I digress, but let's just say it's important to know when the current code is inside a transaction context.
Previously, the best knowledge we had said to run this on Adobe:
// ADOBE ONLY!
var isInTransaction = createObject(“java”, “coldfusion.tagext.sql.TransactionTag”).getCurrent()
and something like this on Lucee:
// LUCEE ONLY!
var isInTransaction = getPageContext().getDataSourceManager().isAutoCommit() ? false : true;
But digging through the Hibernate Session docs, I found a wonderful little method called `isTransactionInProgress`. And just like that, here's a CFML method to wrap it and consistently detect the transactional context:
boolean function isInTransaction(){
if ( listFindNoCase( "Lucee", server.coldfusion.productname ) ) {
return ORMGetSession().isTransactionInProgress();
} else {
return ORMGetSession().getActualSession().isTransactionInProgress();
}
}
That little beauty works
- across CFML engines from Lucee to Adobe ColdFusion
- across multiple Hibernate versions from v3.x through v5.x
Now, to be fair, I haven't really stress-tested this. It's possible there are a few situations where Hibernate doesn't yet know a transaction has begun. But so far... it works, and works well!
Until next time!