At the moment opt locking, when used outside the scope of a transaction, creates an implicit transaction for the scope of a call.
The problem I have here is that at the moment a rollback of an implicit transaction is swept under the carpet and the method returns seemingly successfully.
IMO this should throw a CacheException that wraps the cause of the RollbackException.
I've created a JIRA for this - JBCACHE-1038 - but my concern is whether this will break any existing integration code like EJB3/HTTP session repl code.
As long as the putForExternalRead semantics aren't affected, I don't see a problem. Web sessions and SFSB use pessimistic.