In general, a transaction has atomicity, with commit or rollback. But in ESL the term means less than that. In ESL we might just mean that a thread from one component executes a method on another. However, the call and return of the thread normally achieve flow control and implement the atomic transfer of some datum, so the term remains relatively intact.
We can have blocking and non-blocking coding styles:
In SystemC: blocking requires an SC_THREAD, whereas non-blocking can use an SC_METHOD.
Which is better: a matter of style ? Non-blocking enables finer-grained concurrency and closer to cycle-accurate timing results. (TLM 2.0 sockets will even automatically map between styles.)