PostgreSQL, Oracle e SQL Server trattano tutti questo come un'operazione atomica. Vedi il seguente SQL Fiddle e cambia il server per vedere il comportamento del seguente SQL :
CREATE TABLE Swap (
a CHAR(1),
b CHAR(1)
);
INSERT INTO Swap (a, b) VALUES ('a', 'b');
UPDATE Swap SET a = b, b = a;
SELECT * FROM Swap;
MySQL è stato l'unico RBDMS a implementarlo con entrambe le colonne contenenti lo stesso valore dopo l'aggiornamento.
Per quanto riguarda il modo in cui risolveresti il problema, estrarrei invece i valori dal database, eseguirò i calcoli all'interno della tua applicazione (invece della tua dichiarazione di aggiornamento) e quindi aggiornerei il database con i valori calcolati. In questo modo puoi garantire che il calcolo verrà eseguito in modo coerente.