Para um sistema distribuído, você poderia:
a) Use "quantidade de subtração ou erro de retorno se você não puder", onde o código responsável por baz
retornará um erro se o resultado for negativo (ou retorna "sucesso" se não houver erro)
b) Use o equivalente de bloqueio; onde o código responsável por baz
tem um "adquirir baz" e "release baz" que precisam ser usados antes e depois.
Observe que isso geralmente é apenas a ponta do iceberg. É mais provável que você tenha duas ou mais contas bancárias e queira transferir fundos de uma para as outras, de modo que todas as contas sejam atualizadas ou nenhuma seja atualizada. Nesse caso, você pode (por exemplo) acabar com uma combinação.
Por exemplo, se houver duas contas "Fred" e "Jane" e você quiser transferir US $ 5 de Fred para Jane; então você pode acabar com uma sequência como:
-
De você para a conta de Fred: "Se a conta de Fred tiver 5 ou mais bloqueio a conta de Fred e diga que eu posso prosseguir, caso contrário, diga que não posso continuar"
-
Da conta de Fred para você: "Você pode continuar"
-
De você para a conta de Jane: "Se a conta de Jane puder ser aumentada em 5 bloqueie a conta de Jane e diga que eu posso prosseguir, caso contrário, diga que não posso prosseguir"
-
Da conta de Jane para você: "Você pode continuar"
-
De você para a conta de Fred: "Subtraia 5 da conta de Fred e libere a trava que você me deu anteriormente"
-
De você para a conta de Jane: "Adicione 5 à conta de Jane e libere o bloqueio que você me deu anteriormente"
Observe que, para este exemplo; você, a conta de Fred e a conta de Jane podem estar todas rodando em computadores completamente diferentes se comunicando com mensagens / pacotes (sem nenhuma memória compartilhada).