Why am I getting old data?
You will find the chapter Read Committed Isolation Level of the Postgres 9.5 manual instructive:


  Read Committed is the default isolation level in PostgreSQL. When a
  transaction uses this isolation level, a SELECT query (without a
  FOR UPDATE/SHARE clause) sees only data committed before the query began;
  it never sees either uncommitted data or changes committed during
  query execution by concurrent transactions.


Bold emphasis mine.

Until your transaction is committed, changes are not visible to other transactions. VACUUM has nothing to do with this, it only cleans up dead tuples after all transactions are finished with them.