обработка транзакций: как управляются одновременные транзакции? - PullRequest
1 голос
/ 15 июля 2011

Предположим, что на счете ABC происходит транзакция снятия 6000 с счета (фонд: 1000), и одновременно с банкоматом производится снятие 8000. Тогда как будет управляться транзакция. Будет ли база данных открывать только одно подключение и не разрешать новое подключение к той же учетной записи? .... Что произойдет в тех случаях, когда транзакция должна быть сделана на одном и том же счете одновременно, и как эти вещи управляются.

Ответы [ 2 ]

4 голосов
/ 15 июля 2011

Это хороший вопрос на очень сложную тему.Есть технический термин базы данных, транзакция , который гарантирует, что две конфликтующие операции не могут происходить одновременно ;это происходит путем реализации доктрины 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

3 голосов
/ 15 июля 2011

Зависит от того, что происходит внутри транзакции и уровень изоляции транзакции .Например, SERIALIZABLE (самый высокий уровень изоляции) гарантирует, что транзакции будут выполняться одна за другой.В любом случае подключение к базе данных будет разрешено, но транзакции можно откатить.

...