BEGIN
BEGIN — начать блок транзакции
Синтаксис
BEGIN [ AUTONOMOUS ] [ WORK | TRANSACTION ] [режим_транзакции
[, ...] ] Гдережим_транзакции
может быть следующим: ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED } READ WRITE | READ ONLY [ NOT ] DEFERRABLE
Описание
BEGIN
начинает блок транзакции, то есть обозначает, что все операторы после команды BEGIN
и до явной команды COMMIT
или ROLLBACK
будут выполняться в одной транзакции. По умолчанию (без BEGIN
) Postgres Pro выполняет транзакции в режиме «autocommit» (автофиксация), то есть каждый оператор выполняется в своей отдельной транзакции, которая неявно фиксируется в конце оператора (если оператор был выполнен успешно; в противном случае транзакция откатывается).
В блоке транзакции операторы выполняются быстрее, так как для запуска/фиксации транзакции производится масса операций, нагружающих процессор и диск. Кроме того, выполнение нескольких операторов в одной транзакции позволяет обеспечить целостность при внесении серии связанных изменений; другие сеансы не видят промежуточное состояние, когда произошли ещё не все связанные изменения.
Если указан уровень изоляции, режим чтения/записи или устанавливается отложенный режим, новая транзакция получает те же характеристики, что и после выполнения SET TRANSACTION
.
В случае указания необязательного ключевого слова AUTONOMOUS
начинается автономная транзакция. Автономная транзакция может выполняться только внутри другой транзакции. За подробностями обратитесь к Главе 16.
Параметры
AUTONOMOUS
Начинает автономную транзакцию внутри другой транзакции.
WORK
TRANSACTION
Необязательные ключевые слова, не оказывают никакого влияния.
За описанием других параметров обратитесь к SET TRANSACTION.
Примечания
START TRANSACTION
делает то же, что и BEGIN
.
Для завершения блока транзакции используйте COMMIT
или ROLLBACK
.
При попытке выполнить BEGIN
внутри уже начатого блока транзакции будет выдано предупреждение, а состояние транзакции не изменится. Для вложения подтранзакций внутри блока транзакций используйте точки сохранения (см. SAVEPOINT).
Для сохранения обратной совместимости допускается перечисление режимов_транзакции
без запятых.
Примеры
Начало блока транзакции:
BEGIN;
Совместимость
BEGIN
— это языковое расширение Postgres Pro. Эта команда равнозначна соответствующей стандарту SQL команде START TRANSACTION
, в описании которой можно найти дополнительные сведения о совместимости.
Значение DEFERRABLE
параметра режим_транзакции
является языковым расширением Postgres Pro.
По стечению обстоятельств ключевое слово BEGIN
имеет другое значение во встраиваемом SQL, поэтому при портировании приложений баз данных рекомендуется внимательно сверить семантику транзакций.
См. также
COMMIT, ROLLBACK, START TRANSACTION, SAVEPOINT3.3. Foreign Keys
Recall the weather
and cities
tables from Chapter 2. Consider the following problem: You want to make sure that no one can insert rows in the weather
table that do not have a matching entry in the cities
table. This is called maintaining the referential integrity of your data. In simplistic database systems this would be implemented (if at all) by first looking at the cities
table to check if a matching record exists, and then inserting or rejecting the new weather
records. This approach has a number of problems and is very inconvenient, so Postgres Pro can do this for you.
The new declaration of the tables would look like this:
CREATE TABLE cities ( name varchar(80) primary key, location point ); CREATE TABLE weather ( city varchar(80) references cities(name), temp_lo int, temp_hi int, prcp real, date date );
Now try inserting an invalid record:
INSERT INTO weather VALUES ('Berkeley', 45, 53, 0.0, '1994-11-28');
ERROR: insert or update on table "weather" violates foreign key constraint "weather_city_fkey" DETAIL: Key (city)=(Berkeley) is not present in table "cities".
The behavior of foreign keys can be finely tuned to your application. We will not go beyond this simple example in this tutorial, but just refer you to Chapter 5 for more information. Making correct use of foreign keys will definitely improve the quality of your database applications, so you are strongly encouraged to learn about them.