in reply to Transcation based sales...

You can add a time-out. I'd probably use the session timeouts for that, ie. if a session is timed-out and cleared removed, put the items in it "back in the main storage". Session time-out usually happens about 15 - 30 mins after the last request made using that session.

This doesn't protect you from potentially (and temporarily) reserving too many items. You could "run out" of stock without actually selling everything, but it's a friendlier way of handling potential customers.