PostgreSQL, Oracle e SQL Server tratam isso como uma operação atômica. Veja o SQL Fiddle a seguir e alterne o servidor para ver o comportamento do SQL a seguir :
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;
O MySQL foi o único RBDMS que implementou isso com ambas as colunas contendo o mesmo valor após a atualização.
Quanto a como você resolveria isso, eu puxaria os valores do banco de dados, faria os cálculos dentro de seu aplicativo (em vez de sua instrução de atualização) e, em seguida, atualizaria o banco de dados com os valores calculados. Dessa forma, você pode garantir que o cálculo seja realizado de maneira consistente.