Why Transients may not work correctly?

By the definition and the usage pattern, transients might be deleted at any point in time, the expiry time parameter really specifies only the maximal time the value will be cached. It might be that the particular site has a problem with transients not being cleaned on time and employs some code to clean them automatically every hour.
I think using options and cron for caching is more reliable then transients, but it is probably doesn’t worth your effort if it is only the odd site that misbehaves.