HIVE-12366 improved the heartbeater logic by bringing down the gap between the lock acquisition and first heartbeat, but that's not enough, there may still be some issue, e.g.
Time A: a transaction is opened
Time B: acquireLocks is called (blocking call), but it can take a long time to actually acquire the locks and return if the system is busy
Time C: as acquireLocks returns, the first heartbeat is sent
If hive.txn.timeout < C - A, then the transaction will be timed out and aborted, thus causing failure.