I figured this out at long last... The root cause of the problem was the Scan object's toString method:
@Override public String toString() { return ReflectionToStringBuilder.reflectionToString(this); } It used the apache common-lang's RefelectionToStringBuilder and this jar was not in the ignite libs folder. Once in there, transactions worked with multiple server nodes under heavy loads. The problem was easy to reproduce - just remove this jar from the libs folder. The error message that results is the same as shown above and does not point to the real underlying cause, so that is what caused the confusion: org.apache.ignite.internal.processors.cache.transactions.IgniteTxLocalAdapter.implicitSingleResult(IgniteTxLocalAdapter.java:352) I am guessing that because this ReflectionToStringBuilder.toString() is only used in the Scan object's toString() method, it is never needed by Ignite until at some point an exception is thrown and a logger calls the toString on the Scan object and a java.lang.NoClassDefFoundError is not anticipated... I tried invoking the ReflectionToStringBuilder.toString() more directly from the dequeuer code itself and I did see the expected error in the logs: java.lang.NoClassDefFoundError: org/apache/commons/lang/builder/ReflectionToStringBuilder at... -- Sent from: http://apache-ignite-users.70518.x6.nabble.com/