トランザクション制御
SQL 処理を完全に実行するか、またはまったく実行しないようにトランザクションを制御することで、データベースの整合性を高めることができます。 トランザクション制御コマンドには BEGIN、COMMIT、ROLLBACK の 3 つがあります。
自動コミット・トランザクション・モードがサポートされている。 このモードでは、すべての SQL コマンドが、実行時にコミットされます。 BEGIN SQL コマンドより前に SQL コマンドが検出されると、自動コミット・トランザクション・モードで SQL コマンドが実行されます。 BEGIN SQL コマンドが検出されると、それ以降のすべての SQL コマンドがそのトランザクションで実行されます。 トランザクションを終了するには、COMMIT コマンドまたは ROLLBACK SQL コマンドを発行する必要があります。
SQL コマンドの一部は、BEGIN/COMMIT トランザクション・ブロック内での使用が禁止されています。 例:
- BEGIN
- [CREATE | DROP] DATABASE
- ALTER TABLE [ADD | DROP] COLUMN 操作
- SET AUTHENTICATION
- [SET | DROP] CONNECTION
- GROOM TABLE
- GENERATE STATISTICS
- SET SYSTEM DEFAULT HOSTKEY
- [CREATE | ALTER|DROP] KEYSTORE
- [CREATE | DROP] CRYPTO KEY
- SET CATALOG
- SET SCHEMA dbname.schemaname ここで、dbname は現在のデータベース以外のデータベース
これらの SQL コマンドはNetezza Performance Serverストアド プロシージャのボディ内でも禁止されています。 これらのコマンドのうちいずれかをトランザクション・ブロックまたはストアード・プロシージャーの中で使用すると、次のようなエラー・メッセージが表示されます。
ERROR: CREATE DATABASE: may not be called in a transaction block or stored procedure
注意:同時にセッションを行うとエラーが発生する可能性がありますCannot
insert a duplicate key into unique index.この問題は、同じデータベースとスキーマに複数のセッションが接続されていて、それらのセッションでユーザがトランザクション・ブロックを開始し、同じオブジェクト名でCREATEOBJECT object_nameコマンドを発行すると発生します。 最初の CREATE コマンドがコミットされるまで、その object_name を指定した後続のすべての
CREATE コマンドが待機します。コミットされると、他の CREATE object_name コマンド
は重複キー・エラーで失敗します。 最初の CREATE OBJECT object_name コマンドが
ロールバックされた場合、システムはその object_name の CREATE コマンドを発行した次のセッション/トランザクション・ブロックに進みます。
そして、残りの CREATE object_name コマンドが重複キー・エラーで
失敗します。 テーブル・オブジェクトに対して、トランザクション・ブロック内に IF NOT EXISTS
構文を使用しても、object_name の CREATE TABLE コマンドが重複キー・エラーで失敗する
ことを防げません。