SET TRANSACTION文【SET TRANSACTION statement】
概要

トランザクション処理とは、データベースへの一連の処理を一体不可分の一つのまとまりとして扱う仕組みである。複数の更新や照会をまとめて扱うことで、処理の途中で他の処理がデータを変更し、矛盾が生じる事態を防ぐ。SQLでは、処理が成功すればCOMMIT文で確定し、問題が生じればROLLBACK文で元に戻す。
「分離レベル」とは、複数のトランザクションが同時にデータベースへアクセスする際、互いにどの範囲まで影響を及ぼし合うかを定める基準である。標準SQLでは「READ UNCOMMITTED」や「READ COMMITTED」「REPEATABLE READ」「SERIALIZABLE」という段階が定義されており、レベルが厳格になるほど他のトランザクションからの干渉は少なくなる一方、処理の並行性は下がる。SET TRANSACTION文でこの基準をトランザクションごとに選べる。
SET TRANSACTION文ではアクセスモードの設定も可能である。「READ ONLY」を指定すると、そのトランザクション内ではデータの参照のみが許され、更新や削除は行えなくなる。一方、「READ WRITE」を指定すれば参照と更新の両方が可能になる。読み取り専用に設定することで、意図しないデータの変更を防ぎつつ、処理の負荷を抑える運用が可能になる。
分離レベルやアクセスモードへの対応状況は、データベース管理システム(DBMS)によって異なる。例えば、MySQLでは分離レベルの既定値が「REPEATABLE READ」であり、PostgreSQLでは通常「READ COMMITTED」が用いられる。MySQLのSET TRANSACTION文には「GLOBAL」や「SESSION」を付けて既定値を変更する機能もあるが、PostgreSQLでは現在のトランザクションのみに設定が適用され、その後のトランザクションには影響しない。
SET TRANSACTION文を用いる際には、原則としてトランザクション処理の先頭で設定を行う必要がある。多くの製品では、データの参照や更新を行う文がすでに実行された後は、分離レベルなどの設定を変更できないためである。必要な条件はトランザクションの処理が始まる前にあらかじめ指定しておく必要がある。