Return errors instead of assuming transaction failure is always a cancel