2013/08/22

08-06.データー操作語(DML)【トランザクション(commit, rollback, savepoint)】

■トランザクション(TRANSACTION)とは?
 -トランザクションはデーター処理の1単位
 -オラクルサーバで発生するSQL文が1つの論理的単位で成功または失敗する一連の単位がトランザクション
 -オラクルサーバはトランザクションを根拠にデーターの一貫性を保証する
 -トランザクションはデーターを変更するDMLで構成される(COMMIT, ROLLBACK, SAVEPOINT)

・TARNSACTIONの開始
 -実行可能なSQL文が最初に実行される時

・TRANSACTIONの終了
 -COMMITまたはROLLBACK
 -DDLまたはDCL文の実行(自動COMMIT)
 -障害またはシステム衝突(CRASH)
 -deadlock発生
 -ユーザーの正常終了

・自動COMMIT(DDL:CREATE, ALTER, DROP / DCL:GRANT, REVOKE)は下記の場合、発生
 -DDL,DCL文が完了する時
 -明示的にCOMMIT、ROLLBACK無しでSQL*PLUSを正常に終了した場合

・自動ROLLBACKは下記の場合、発生
 -SQL*PLUSを非常に終了した場合
 -非常終了、SYSTEM FAILURE


■COMMITとROLLBACK
 -以前のCOMMITから次のCOMMIT前までの作業が1つのトランザクションであり、
  COMMITとROLLBACKはトランザクションの単位でDBで発生した作業を保存、削除することを言う
 -COMMIT:変更の保存
 -ROLLBACK:変更の取消

・COMMITとROLLBACKの長所
 -データーの一貫性を提供する
 -データーの永久的に変更する前、データーの変更を確認できる
 -関連作業を論理的にグループ化出来る
 -COMMIT,SAVEPOINT,ROLLBACK文でTRANSACTIONの論理を制御できる

・COMMITやROLLBACK以前のデーター状態
 -データー以前の状態に復旧可能
 -現在のユーザーはSELECT文でDML作業結果を確認できる
 -他のユーザーはSELECT文で現在ユーザーが使用したDML文の結果を確認できない
 -変更された行はロックされ他のユーザーは変更できない

・COMMIT以後のデーター状態
 -DBにデーターを永久に変更
 -データーの変更以前状態は完全消失
 -他のユーザーも検索できる
 -変更された行のロックが解除され他ユーザーが変更できる
 -すべてのSAVEPOINTは消去される


SQL> SELECT empno FROM emp WHERE empno = 7521;

     EMPNO
----------
      7521

SQL> DELETE FROM emp WHERE empno = 7521;

1行が削除されました。

SQL> COMMIT;

コミットが完了しました。


--1行を削除して、COMMIT文でデーターを永久に保存した
--1トランザクションの終了と新しいトランザクションの発生を意味する


SQL> SELECT empno FROM emp WHERE empno = 7521;

レコードが選択されませんでした。

--結果表示タイミングを見る為に時間を表示させる
SQL> SET TIME ON
16:48:50 SQL> INSERT INTO emp(empno, ename, hiredate)
16:50:18   2  VALUES (9000, 'test', sysdate);

1行が作成されました。

16:50:19 SQL> COMMIT;

コミットが完了しました。

16:50:23 SQL> SELECT empno FROM emp WHERE empno = 9000;

     EMPNO
----------
      9000

16:50:27 SQL> DELETE FROM emp WHERE empno = 9000;

1行が削除されました。

16:50:48 SQL> SELECT empno FROM emp WHERE empno = 9000;

レコードが選択されませんでした。

--empno 9000のデーターを追加してCOMMITでデーターを保存した後、
--データーを削除してSELECTをすると、データーは検索されない


--しかし、別ユーザーからはCOMMIT、ROLLBACKする前に登録した
--empno 9000のデーターが検索できる
16:50:59 SQL> SHOW USER
ユーザーは"SYS"です。
16:51:11 SQL> SELECT empno FROM scott.emp WHERE empno = 9000;

     EMPNO
----------
      9000

16:51:15 SQL>
--データーベースではこれを一貫性と言う


--scottユーザーに戻る
16:51:20 SQL> ROLLBACK;

ロールバックが完了しました。

--以前のトランザクション(COMMIT)発生後から今発生したROLLBACK前までの
--作業を取り消す

--検索するとempno 9000のデーターが検索される
16:51:48 SQL> SELECT empno FROM emp WHERE empno = 9000;

     EMPNO
----------
      9000

16:51:53 SQL>


■SAVEPOINTとROLLBACK TO
 -SAVEPOINTはユーザーがトランザクション作業を複数のセグメントに分割出来るようにする作業
 -SAVEPOINTは部分的なROLLBACKをするためのトランザクションのチェックポイントを定義

SQL> INSERT INTO emp(empno, ename, hiredate)
  2  VALUES (1000, 'test2', sysdate);

1行が作成されました。

--SAVEPOINTを作成
SQL> SAVEPOINT A;

セーブ・ポイントが作成されました。

SQL> INSERT INTO emp(empno, ename, hiredate)
  2  VALUES (1001, 'test3', sysdate);

1行が作成されました。

SQL> INSERT INTO emp(empno, ename, hiredate)
  2  VALUES (1002, 'test4', sysdate);

1行が作成されました。

SQL> SELECT empno, ename
  2  FROM emp
  3  WHERE empno IN (1000, 1001, 1002);

     EMPNO ENAME
---------- ----------
      1000 test2
      1001 test3
      1002 test4

SQL> DELETE FROM emp
  2  WHERE empno IN (1000, 1001, 1002);

3行が削除されました。

SQL> SELECT empno, ename
  2  FROM emp
  3  WHERE empno IN (1000, 1001, 1002);

レコードが選択されませんでした。


--SAVEPOINTまでロールバックされる
SQL> ROLLBACK TO A;

ロールバックが完了しました。

SQL> SELECT empno, ename
  2  FROM emp
  3  WHERE empno IN (1000, 1001, 1002);

     EMPNO ENAME
---------- ----------
      1000 test2

SQL>

--SAVEPOINTまでROLLBACKが実行された
--その結果、最初に追加したデーターは残り、SAVEPOINT後に追加したデーターは削除された

0 件のコメント:

コメントを投稿

QLOOKアクセス解析