Response.Redirect calls Response.End, which will throw a ThreadAbortException, which is caught by your catch block and then the Rollback cannot occur because the transaction has already been committed. You can use Server.Transfer instead or use overload of Response.Redirect that allows you to specify whether Response.End is called.
See this link for more info http://support.microsoft.com/kb/312629