Язык SQL

Резервирования кассет


В процессе резервирования кассет требуются значительные усилия, чтобы предупредить возникновение ошибок в системе. На 9.16 первый запрос находит среди всех имеющихся видеокассеты с соответствующими названием фильма и номером магазина. Предполагается, что по крайней мере одна такая видеокассета есть, поскольку страница резервирования содержит только фильмы, доступные для проката. Однако за период времени между созданием страницы резервирования и обработкой запроса некие другие клиенты могут арендовать или зарезервировать все видеокассеты с определенным фильмом. Следовательно, в запросе о видеокассетах может не оказаться сущностей. Метод DBConnect.getField вызывается для обработки запроса. В качестве аргумента он использует оператор выборки данных select, выполняет этот оператор и возвращает значение в первый столбец первой строки результирующей таблицы. Если выбранных строк нет, результатом этого вызова будет null. Таким образом, проверка условия videoid==null позволяет обнаружить, имеется ли хотя бы одна доступная видекассета. Если значение videold равно null, выдается сообщение, что. данного фильма нет в наличии.

1 Hashtable request  paprse QueryString(queryString) ;

2 String movies [ ] = (String []).request. get ("movield")

3 for ()int i = 0; i <movies.length; i++) {

//поиск незарезервированной копии

4 String findSql = "select videold from UnrentedVideo where "

5 +"movieId=movies[i]+" and storeId="+storeId;

6 String movieTetleSql = "select title from Movie where movieId=”

7 +movies[i];

8, String videold = db.getField(findSql);// извлечение первого videold

9 String movieTitle = db.getField(movieTetleSql);

// извлечение названия фильма (title)

10 if (videoId==null) // в данном магазине Нет доступной

// для проката кассеты с указанным фильмом

11 htmlOut.println("<h3> movie ‘"+movieTitle

12 +"’ not available</h3>");

13 } else (//резервирование видеокассеты

14 String reserveSql="insert into Reservation values("

15 +customer.accountId+","+videoId+",now)";

16 try( // вставка в таблицу reservation

17 int count = stmt-executeUpdate(reserveSql);

18 if (count!=1) {// проверка результата вставки

19 htmlOut1.println ("<h3> movie "+movieTitle

20 +" not available</h3>);

21 } else (

22 htmlOut.println("<h3> movie ‘"+movieTitle

23 +" now reserved</h3>);

Если доступная для проката видеокассета существует, создается оператор вставки и отправляется в базу данных. Здесь возникает еще одна возможность появления ошибки. В условиях конкуренции эта видеокассета может оказаться недоступной. Например, два клиента одновременно пытаются заказать один и тот1 же фильм в одном магазине. Оба CGI-запроса получат один и тот же videold и оба запроса пытаются вставить его в таблицу Reservation. Одна из двух операций вставки не будет успешной, поскольку атрибут videold является ключом к таблице Reservation. Поэтому необходимо проверить, сколько строк участвовало в операции вставки (с помошью переменной count). Если значение переменной count не равно 1, то операция вставки не была успешной.

Эта проблема может быть решена путем выполнения запроса на выборку videold й вставки в таблицу Reservation в виде единой транзакции базы данных. Подробное изложение управления транзакциями содержится в главе 14, а некоторые примеры управления транзакциями в среде Java приводятся 10.1.

Реальное приложение для резервирования видеокассет обязательно должно иметь компонент ручного управления, т.е. продавец должен взять видеокассету с полки аренды и поместить ,ее на полку сделанных заказов. Вероятно, что за запросом резервирования будут следовать действия продавца по перемещению видеокассеты и посылка подтверждения по электронной почте. При разработке приложений следует стараться сделать их как можно более точными и надежными, учитывая при этом действия людей, которые могут сопровождать автоматизированные процессы.

Комментарии закрыты