This turned out to be nothing to do with transactions.
It was a mistake on my part deploying identical versions of the messaging libraries on the client and server.
The error message in the logs on the server side indicated the reason for the read timeout. The boolean field member called checkForDuplicates was not being transported across the wire by the client.
2010-09-23 12:47:05,002 ERROR [org.jboss.remoting.transport.socket.ServerThread] (WorkerThread#63[10.0.1.1:56283]) WorkerThread#63[10.0.1.1:56283] failed
java.io.IOException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:146)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
at java.io.BufferedInputStream.read(BufferedInputStream.java:254)
at java.io.DataInputStream.readBoolean(DataInputStream.java:242)
at org.jboss.jms.wireformat.ConnectionSendTransactionRequest.read(ConnectionSendTransactionRequest.java:69)
at org.jboss.jms.wireformat.JMSWireFormat.read(JMSWireFormat.java:298)
at org.jboss.remoting.transport.socket.ServerThread.versionedRead(ServerThread.java:902)
at org.jboss.remoting.transport.socket.ServerThread.completeInvocation(ServerThread.java:754)
at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:744)
at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:586)
at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:234)
2010-09-23 12:47:05,002 ERROR [org.jboss.remoting.transport.socket.ServerThread] (WorkerThread#13[10.0.1.1:56123]) WorkerThread#13[10.0.1.1:56123] failed
java.io.IOException
at java.io.DataInputStream.readBoolean(DataInputStream.java:244)
at org.jboss.jms.wireformat.ConnectionSendTransactionRequest.read(ConnectionSendTransactionRequest.java:69)
at org.jboss.jms.wireformat.JMSWireFormat.read(JMSWireFormat.java:298)
at org.jboss.remoting.transport.socket.ServerThread.versionedRead(ServerThread.java:902)
at org.jboss.remoting.transport.socket.ServerThread.completeInvocation(ServerThread.java:754)
at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:744)
at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:586)
at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:234)
Jeremy