It is recommended to wrap each call (individual or multiple calls) in transaction. This helps generating reliable results in case of multi-threaded/multi-process environment when other thread/process alter the data you are reading. The call also include Read call.
Other reason why it is recommended is because modern RDBMS always wrap each call in transaction if not already done. It costs. Better if programmer already know the Unit Of Work, that cost can be saved and also calls can be grouped far better.
But, it may not be necessary for any (Create, Read, Update, Delete) call depending on scenario. It is per case decision. If you avoiding doing this due to "code looks ugly" reason, please consider implementing UoW.
By the way, I hope you are not calling BuildSessionFactory
for each call. That is costly and more importantly, not needed. Call it at startup of your application instead.
In response to comment:
I mean same as mentioned in comment by "Oskar Berggren"; its just not explicit enough. As question is more about transaction and UoW is more than just transaction, I preferred to just "mention" the UoW than going into details.
With reference to first paragraph, "multiple calls" could be enclosed in single Unit Of Work. Please understand that UoW is more than transaction. With ORM like NHibernate, use of UoW makes far better use of transaction. Also note that with full ORM, you do not need to do too much to implement UoW. ISession
itself is UoW. You just need to scope-use-manage it properly.
Following answers may be helpful to you:
https://stackoverflow.com/a/51781877/5779732
https://stackoverflow.com/a/50721461/5779732