Una de las principales ventajas de la memoria transaccional de software que siempre se menciona es la componibilidad y la modularidad. Se pueden combinar diferentes fragmentos para producir componentes más grandes. En los programas basados en bloqueo, este no suele ser el caso.
Estoy buscando un ejemplo simple que ilustra esto con código real. Prefiero un ejemplo en Clojure, pero Haskell también está bien. Puntos de bonificación si el ejemplo también muestra un código basado en bloqueo que no se puede componer fácilmente.
Respuestas:
Supongamos que tiene algunas cuentas bancarias:
Y una función de "transferencia" atómica:
Que funciona de la siguiente manera:
Luego puede componer fácilmente la función de transferencia para crear una transacción de nivel superior, por ejemplo, la transferencia desde varias cuentas:
Tenga en cuenta que todas las transferencias múltiples ocurrieron en una sola transacción combinada, es decir, fue posible "componer" las transacciones más pequeñas.
Hacer esto con los bloqueos se complicaría muy rápidamente: suponiendo que las cuentas debían bloquearse individualmente, entonces tendría que hacer algo como establecer un protocolo de orden de adquisición de bloqueos para evitar bloqueos. Es muy fácil cometer un error difícil de detectar. STM te salva de todo este dolor.
fuente