Команда SET TRANSACTION встановлює характеристики поточної транзакції. На наступні транзакції вона не впливає. SET SESSION CHARACTERISTICS встановлює характеристики транзакції за замовчуванням для наступних транзакцій в рамках сеансу. Задані за замовчуванням характеристики потім можна перевизначити для окремих транзакцій командою SET TRANSACTION.
До характеристик транзакції належить рівень ізоляції транзакції, режим доступу транзакції (читання / запис або тільки читання) і допустимість її відкладання. На додаток до них можна вибрати знімок, але тільки для поточної транзакції, не для сеансу за умовчанням.
Рівень ізоляції транзакції визначає, які дані може бачити транзакція, коли паралельно з нею виконуються інші транзакції:
Оператор бачить тільки ті рядки, які були зафіксовані до початку його виконання. Цей рівень встановлюється за умовчанням. REPEATABLE READ
Всі оператори поточної транзакції бачать тільки ті рядки, які були зафіксовані перед першим запитом на вибірку або зміна даних, виконаним в цій транзакції. SERIALIZABLE
Всі оператори поточної транзакції бачать тільки ті рядки, які були зафіксовані перед першим запитом на вибірку або зміна даних, виконаним в цій транзакції. Якщо накладення операцій читання і запису паралельних Серіалізуемое транзакцій може призвести до ситуації, неможливою при послідовному їх виконанні (коли одна транзакція виконується за одною), відбудеться відкат однією з транзакцій з помилкою serialization_failure (збій сериализации).
У стандарті SQL визначений ще один рівень, READ UNCOMMITTED. У Postgres Pro рівень READ UNCOMMITTED обробляється як READ COMMITTED.
Властивість DEFERRABLE впливає, тільки якщо транзакція знаходиться також в режимах SERIALIZABLE і READ ONLY. Коли для транзакції встановлені всі три цих властивості, транзакція може бути заблокована при першій спробі отримати свій знімок даних, після чого вона зможе виконуватися без додаткових зусиль, звичайних для режиму SERIALIZABLE. і без ризику привести до збою сериализации або постраждати від нього. Цей режим підходить для тривалих операцій, наприклад для побудови звітів або резервного копіювання.
Якщо команді SET TRANSACTION не передує START TRANSACTION або BEGIN. вона видає попередження і більше нічого не робить.
Без SET TRANSACTION можна обійтися, задавши необхідні режіми_транзакціі в операторах BEGIN або START TRANSACTION. Але для SET TRANSACTION SNAPSHOT такої можливості не передбачено.
Режими транзакції для сеансу за умовчанням можна також задати в конфігураційних змінних default_transaction_isolation. default_transaction_read_only і default_transaction_deferrable. (На практиці, SET SESSION CHARACTERISTICS - це просто більш багатослівна альтернатива зміни цих змінних командою SET.) Це означає, що значення цих змінних за замовчуванням можна задати у файлі конфігурації, за допомогою команди ALTER DATABASE і т. Д. За додатковими відомостями зверніться до главі 20.
Щоб почати нову транзакцію зі знімком даних, який отримала вже існуюча транзакція, його потрібно спочатку експортувати з першої транзакції. При цьому буде отримано ідентифікатор знімка, наприклад:
Потім цей ідентифікатор потрібно передати команді SET TRANSACTION SNAPSHOT на початку нової транзакції:
сумісність
Ці команди визначені в стандарті SQL. за винятком режиму транзакції DEFERRABLE і форми SET TRANSACTION SNAPSHOT. які є розширеннями Postgres Pro.
У стандарті рівнем ізоляції за замовчуванням є SERIALIZABLE. У Postgres Pro рівнем за замовчуванням зазвичай вважається READ COMMITTED. але його можна змінити, як описано вище.
У стандарті SQL є ще одна характеристика транзакції, яку не можна задати цими командами: розмір діагностичної області. Ця специфічна концепція вбудованого SQL, тому в сервері Postgres Pro вона не реалізована.
Стандарт SQL вимагає, щоб послідовні режіми_транзакцій поділялися запитом, але з історичних причин Postgres Pro дозволяє опустити коми.