Transient not behaving as expected

rule of thumb is probably to use transients for simple objects (strings integers, array) as the result of unserialization of objects might be surprising and side effect might happen unless the object is fully static.

IIRC, when unserializing an object PHP will also run its default constructor, which in your case will do the query again as unserialization is being done when it is retrieved from the DB.