From b55436aa3d45c674c7aceac6c0691e70a7edada0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jannes=20H=C3=B6ke?= Date: Sun, 12 Jun 2016 02:44:39 +0200 Subject: [PATCH] Updated Performance Optimizations (markdown) --- Performance-Optimizations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Performance-Optimizations.md b/Performance-Optimizations.md index 128b2f2..2befca0 100644 --- a/Performance-Optimizations.md +++ b/Performance-Optimizations.md @@ -80,7 +80,7 @@ I skipped some of the implementation details, so here's a short explanation: Sadly, ~~you~~ that damn intern fell right into the trap. Let's say there are two morally corrupt customers, *Customer A* with *Account A* and *Customer B* with *Account B*, who both make a transaction simultaneously. *Customer A* sends *Transaction AB* of *10CU* to *Customer B*. At the same time, *Customer B* sends a *Transaction BA* of *100CU* to *Customer A*. CU simply means **C**urrency **U**nit like Dollar or Euro. -Now the Dispatcher starts two threads, *Thread AB* and *Thread BA*, almost simultaneously. Both threads read the accounts from the database with the **same** balance and calculate a new balance for both of them. In most cases, one of the two transactions will simply overwrite the other. That's not too bad, but will at least be confusing to the customers. But because threads are quite unpredictable and can be [suspended and resumed by the operating system](https://en.wikipedia.org/wiki/Scheduling_(computing)) at *any* point in the code, so the following order of execution can occur: +Now the Dispatcher starts two threads, *Thread AB* and *Thread BA*, almost simultaneously. Both threads read the accounts from the database with the **same** balance and calculate a new balance for both of them. In most cases, one of the two transactions will simply overwrite the other. That's not too bad, but will at least be confusing to the customers. But threads are quite unpredictable and can be [suspended and resumed by the operating system](https://en.wikipedia.org/wiki/Scheduling_(computing)) at *any* point in the code, so the following order of execution can occur: 1. *Thread AB* executes `bank.write_account(source)` and updates *Account A* with *-10CU* 2. Before updating *Account B*, *Thread AB* is put to sleep by the operating system