Это хороший вопрос на очень сложную тему.Есть технический термин базы данных, транзакция , который гарантирует, что две конфликтующие операции не могут происходить одновременно ;это происходит путем реализации доктрины ACID (атомарность, согласованность, изоляция, долговечность).ACID является ядром реляционных баз данных (таких как Oracle, Postgres, MySQL и MSSQL).Очень кратко:
Атомность означает, что либо происходит вся транзакция, либо ничего не происходит: либо деньги изымаются из одного места, депонируются в другом, ивсе записывается (и транзакция завершается успешно), или транзакция прерывается (откатывается), как будто ничего не произошло;это гарантирует, что вы не можете иметь, например, только вывод без депозита.
Согласованность означает, что у вас всегда безошибочное состояние: транзакции либо завершеныили они вообще не происходят, поэтому нет незавершенных или неудачных транзакций (например, вы не можете иметь два обновления баланса одновременно, поскольку вы можете получить несовместимое состояние)
Изоляция означает, что любой возникающий запрос может предполагать, что ничто другое не касается данных - например, в вашем случае банкомату не нужно заботиться о том, кто еще пытается получить доступ к учетной записи.Это может означать более медленное выполнение («К сожалению, доступ к этой строке сейчас недоступен, пожалуйста, подождите»), но значительно упрощает алгоритмы приложения.
Долговечность означаетчто это сохраняется даже в случае сбоя системы - всегда есть согласованное состояние, даже если отключается питание.
См., например, это для дальнейшего чтения: http://www.agiledata.org/essays/transactionControl.html
Таким образом, на практике «одновременно» не происходит: один запрос будет первым в строке, а другой будет вторым (так как строка с вашим балансом заблокирована первым запросом, второй процесс должен ждать, пока он не станет доступным).Из-за изоляции не нужно беспокоиться о «одновременно»: либо денег достаточно для вывода сейчас , либо их нет;совсем не имеет значения, что очередное снятие ставится в очередь и будет предпринято через 50 миллисекунд (когда первый запрос завершается, база данных снимает блокировку на соответствующих строках, и следующий запрос в очереди будет происходить).Со скоростью современных компьютеров вы можете воспринимать тех, которые происходят одновременно (1/20 секунды почти незаметны), но на самом деле это не так, они последовательны.
Это также может представлять интерес: http://en.wikipedia.org/wiki/Concurrency_control#Database_transaction_and_the_ACID_rules