原子性
メニューを表示するにはスワイプしてください
原子性は、SQLにおけるACID特性の一つであり、SQLを使用してデータをクエリする際にトランザクションを利用することを保証します。 SQLデータベースの文脈では、原子性は特定の論理単位内のすべての操作が完了するか、いずれも完了しないことを保証します。
SQLにおけるトランザクション処理
主な特徴
-
ロールバック: 途中で失敗した場合(例:エラーや制約違反など)、トランザクション全体がロールバックされ、変更が元に戻される;
-
コミット: すべての操作が成功した場合、トランザクションがコミットされ、変更が永続的になる。
SQLでのトランザクション作成
SQLでは、個々のステートメントがトランザクションとして扱われます。 ただし、複数のステートメントを含むトランザクションを手動で作成することも可能です。
次のようなシナリオを想定します:
-
BankAccountsテーブルには、account_number(主キー)、account_holder、balanceのカラムが含まれています; -
UserLogsテーブルには、account_number、action、timestampなどのカラムがあります。account_numberとtimestampの組み合わせがこのリレーションの複合主キーです。
次のコードサンプルでは、これらのテーブルにデータを挿入・管理する方法を示し、提供されたスキーマの実際のエントリを用いて原子的な操作を実演します。
12SELECT * FROM BankAccounts;
12SELECT * FROM UserLogs;
ここで、新しい銀行口座を作成し、同時にその追加を示すログエントリを生成するシナリオを考えます。 これら2つの操作、すなわち口座の追加とイベントの記録は、単一の論理単位として扱われ、1つのトランザクション内で実行される必要があります。以下は、トランザクションを用いてこれを実現する非常に基本的な例です。
123456789101112131415161718-- Begin the transaction BEGIN; -- Insert a new bank account with account number 109, account holder Emma Watson, and initial balance of 0 INSERT INTO BankAccounts (account_number, account_holder, balance) VALUES (109, 'Emma Watson', 0); -- Step 2: Add log entry if the account was added -- Insert a log entry into the UserLogs table indicating that a new account was added with account number 109 INSERT INTO UserLogs (account_number, action) VALUES (109, 'New account added'); -- Commit the transaction, making the changes permanent COMMIT; -- Check the result SELECT * FROM BankAccounts; SELECT * FROM UserLogs;
上記のクエリでは、BEGIN ブロックを使用して、以降のすべてのステートメントが単一の単位として扱われることを示しています。いずれかのステートメントが実行されない場合、他のステートメントも実行されてはなりません。
COMMIT キーワードは、トランザクションブロックの終了を示します。
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください