There should only be one using/try catch block on the highest level. All of the methods being called within that using block should just throw errors.
You could put the logic in attributes but I don’t consider a transaction a cross cutting concern. It would create a spooky action at a distance situation.