I tried to use client user transaction. The code goes below: InitialContext jndiContext = new InitialContext(); UserTransaction utx = (UserTransaction); jndiContext.lookup("UserTransaction"); Then I begin a client user transaction using utx.begin(), and then connected to HyperSonic database and inserted a record into a table created before. After that, I rollbacked the transaction. In my opinion, the record won't be inserted successfully, but I found that the record is still in the table. That is to say, the transaction wasn't rolled back. I wonder why and think if there's something wrong when I use the client user transaction. Thanks a lot!