UpdateAsync has certain benefits over SetAsync, but you have to actually use them. Code that does not leverage the old data might as well be using SetAsync. There are threads explaining how to use UpdateAsync separately, such as the one below, but overall use SetAsync for quick and dirty saving and UpdateAsync for careful operations taking previous data into account.
Never use UpdateAsync and have the transformFunction look like this:
whatever:UpdateAsync(whatever2, function(old)
return {data = something new}
end)
If you aren’t using old, don’t use UpdateAsync.
Edit: UpdateAsync won’t help your issue here, though. The problem is that you’re saving too frequently. Try saving at set intervals (e.g. once a minute) or when a player leaves instead of every time the event fires.