Currently clustered max idle does not remove any expired entry on a get when transactions are configured. This is due to limitations with pessimistic transactions and deadlocking.
We should be able to remove the entry with optimistic transactions.
Pessimistic is more interesting as we can't wait for the remove expired command to complete in a separate transaction as it would inherently deadlock. Instead we could ascertain that the entry is expired as we do now, but also fire a remove expired completely asynchronously and not wait for it to complete.