Глава 28. Пакет LiveWire Pro__ _______________________677

1. Предположим, что вы обращаетесь в агентство воздушных сообщений и спрашиваете билет в Гонолулу. Агент посылает запрос к базе данных, просматривает список свободных мест и находит одно место на ближайший рейс. Это последнее свободное место на данный рейс. Вы на минуту задумываетесь, хотите ли лететь этим рейсом.

2. Пока вы думаете, другой клиент обращается в агентство с тем же вопросом и получает тот же самый ответ. Теперь двум клиентам предлагается одно и то же место.

3. Вы принимаете решение — лететь. Ваш агент обновляет сведения в базе данных, чтобы зафиксировать тот факт, что последнее место продано.

4. Другой клиент также решает приобрести этот билет. Его агент обновляет базу данных, внося данные о продаже билета клиенту. Запись о том, что билет был продан вам, перекрывается и теряется.

5. Вы приезжаете в аэропорт и выясняете, что вас не хотят даже выслушать. Другой человек улетает вместо вас. Увы.

Описанная выше ситуация является классической проблемой баз данных. Опытные SQL-программисты решают эту проблему, начиная транзакцию до выполнения запроса. База данных предоставляет пользователям режим доступности к данным на чтение, однако наш билетный агент не сможет обновить базу в этом режиме. Когда агент начинает процесс приобретения билета, приложение требует режим блокировки записи(write lock). В то время, когда этот режим доступен для нашего агента, никто другой не может считывать или записывать эти данные. После получения агентом режима блокировки записи приложение снова запрашивает базу данных для проверки, что данное место все еще не занято. Если место свободно, приложение обновляет базу данных, отмечая проданное место как занятое. Затем транзакция завершается, фиксируя изменения, произведенные в базе данных. Теперь сценарий покупки билета с использованием транзакций будет выглядеть следующим образом:

1. Вы обращаетесь в агентство воздушных сообщений и спрашиваете билет в Гонолулу. Агент посылает запрос к базе данных, просматривает список свободных мест и находит одно место на ближайший рейс. Это последнее свободное место на данный рейс. Вы на минуту задумываетесь, хотите ли лететь этим рейсом.

2. Пока вы думаете, другой клиент обращается в агентство с тем же вопросом и получает тот же самый ответ. Теперь двум клиентам предлагается одно и то же место.

3. Вы принимаете решение — лететь. Ваш агент получает режим блокировки записи, приложение вновь обращается к базе данных для проверки, что данное место все еще не занято, обновляет сведения в базе данных и снимает режим блокировки.

4. Другой клиент также решает приобрести этот билет. Его агент получает режим блокировки записи и повторяет запрос. Приходит ответ о том, что