Язык SQL

Транзакции в пакете JDBC


Транзакция (transaction) в базе данных — это совокупность запросов и обновлений, которые выполняются как единый модуль. В частности, или все операции обновления успешно выполняются полностью, или ни одна из них не выполняется вовсе. Транзакции подробно рассматриваются в главе 14. Для прочтения данной главы вы должны понять, что одно или несколько обновлений базы данных выполняются в рамках единой транзакции. Когда клиент базы данных завершает серию обновлений, он обраицается с запросом, чтобы транзакцию считать фиксированной (committed% а обновления окончательными. В противном случае, клиент может сделать запрос о том, чтобы произвести откат (rolled back) транзакции, т.е. всем обновленным сушностям вернуть значения, которые они имели перед началом транзакции.

В пакете JDBC предлагаются две модели выполнения транзакций, аналогично тому. как это делается в языке SQL В режиме автофиксации (autoconunit mode) каждый оператор SQL выполняется как отдельная транзакция. В режиме явной фиксации (explicit commit mode) методы фиксации и отката могут использоваться по отношению к совокупности SQL-операторов.

В режиме автофиксации транзакция запускается при выполнении оператора. Транзакция считается фиксированной, когда все ее результирующие множества и счетчики обновлений извлечены или когда оператор завершен явно. В большинстве случаев все результирующие множества и счетчики обновлений извлекаются с помошью пакета JDBC, и транзакция фиксируется непосредственно после выполнения оператора. Иногда пакет J DBC может задержать фиксацию транзакции до тех пор, пока результаты не будут извлечены приложением.

Чтобы разрешить выполнение в рамках одной транзакции нескольких SQL- операторов, режим автофиксации можно выключить с помошью вызова метода Connect ion.se tAut с Commie t false j. Новая транзакция запускается при выполнении следующего SQL-оператора. Эта транзакция не фиксируется до тех пор, пока не будет вызван метод commit или закрыт объект JDBC Connection.

Если программа приступает к выполнению неавтофиксируемой транзакции, возможны два результата: транзакция может быть фиксирована или отменена. Вызов метода commit делает все изменения окончательными и освобождает все блокировки, удерживаемые на тот момент объектом Connection. Вызов метода rollback отменяет транзакцию, все изменения удаляются, и блокировки базы данных освобождаются.

В приведенном на 8.13 примере createPayStatements необходимо было убедиться в том. что как оплаченные отмечаются именно те карточки учета рабочего времени, которые используются для создания платежных ведомостей. Если эта операция выполняется как автофиксированные транзакции, существует возможность того, что в период между выполнением операторов вставки и обновления может быть введена новая карточка учета рабочего времени. В этом случае новая карточка учета рабочего времени будет помечена как оплаченная, хотя на самом деле она и не использовалась при создании платежной ведомости. Избежать этой ошибки можно, выполняя операторы insert и update как единую транзакцию. На 10.1 приводится код модифицированного тела программы createPayStatements, который теперь гарантирует, что только карточки учета рабочего времени, используемые для создания платежных ведомостей, помечаются как оплаченные

1 try

2 bigHitDB.Connection.setAutoCommit(false),

3 numPayStatements = stmt.executeUpdate(insertSQL; ;

4 numTimeCards «= stmt.executeUpdate(updateTimeCardSQL);

5 System.out.println("numstmts ”+numPayStatements i +’ time cards “+numTimeCards);

1 bigHitDB.Connection.commit();

8 } catch (SQLExeption -) {

9 bigHitDB.Connection.rollback{}:

10 return false;

11 )

Puc. 10.1. Использование транзакции для обеспечения правильности платежных ведомостей и карточек учета рабочего времени

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