天天看點

【Oracle11g】15_事務

目錄

  • 1.什麼是事務?
  • 2.事務的特性(ACID)
    • 2.1 原子性
    • 2.2 一緻性
    • 2.3 隔離性
    • 2.4 永久性
  • 3.事務的指令
    • 3.1 savepoint案例示範

1.什麼是事務?

事務(TRANSACTION)是作為單個邏輯工作單元執行的一系列操作。這些操作作為一個整體一起向系統送出,要麼都執行、要麼都不執行。

事務是一個不可分割的工作邏輯單元。

例如:銀行轉賬過程就是一個事務。它需要兩條UPDATE語句來完成,這兩條語句是一個整體,如果其中任一條出現錯誤,則整個轉賬業務也應取消,兩個賬戶中的餘額應恢複到原來的資料。

2.事務的特性(ACID)

2.1 原子性

原子性(Atomicity):事務是一個完整的操作。事務的各步操作是不可分的(原子的);要麼都執行,要麼都不執行。

2.2 一緻性

一緻性(Consistency):當事務完成時,資料必須處于一緻狀态

案例說明

-- 建表
create table student(sno number,sname varchar2(100),sage number);
insert into student values(1,'Mike',11);
insert into student values(2,'John',22);
insert into student values(3,'Tom',33);
insert into student values(4,'Logan',44);
commit;
           

在視窗1中進行資料的更新,然後新打開視窗2,查詢出來的資料為更新後的資料,這個例子就說明了資料庫的一緻性。

一緻性讀

例如:現在表student非常的大,執行select * from student where sno=4 這條記錄需要半小時,那麼假如10:00我執行這條指令,我在等待資料執行的時候,10:20另外一個使用者執行了update student set sage=66 where sno=4;commit; 到10:30的時候第一條select 語句才傳回查詢結果,那麼傳回的記錄中sage是修改前的還是修改後的呢?

答案是:修改前的,undo段裡保留了修改前的資料

2.3 隔離性

隔離性(Isolation):對資料進行修改的所有并發事務是彼此隔離的,這表明事務必須是獨立的,它不應以任何方式依賴于或影響其他事務

我們先在視窗1中修改sno=4的記錄,不送出的情況下,在視窗2中修改sno=4的記錄,此時我們會發現,在視窗2中被hang住了。當我們在視窗1中執行commit的時候,視窗2也會自動執行update

2.4 永久性

永久性(Durability):事務完成後,它對資料庫的修改被永久保持,事務日志能夠保持事務的永久性

永久性表示資料一旦被更新送出後,就會永久儲存在資料庫中,直到下次更新。

3.事務的指令

Oracle11g中的事務相關的指令:commit savepoint rollback

Sql*plus中,設定是否自動送出:set autocommit on|off

3.1 savepoint案例示範

SQL> create table cust_info(id number,name varchar2(10));

表已建立。

SQL> insert into cust_info values(1,'aa');

已建立 1 行。

SQL> savepoint mark1;

儲存點已建立。

SQL> update cust_info set name='bb';

已更新 1 行。

SQL> savepoint mark2;

儲存點已建立。

SQL> delete from cust_info;

已删除 1 行。

SQL> savepoint mark3;

儲存點已建立。

SQL> insert into cust_info values(1,'cc');

已建立 1 行。

SQL> select * from cust_info;

        ID NAME
---------- ----------
         1 cc

SQL> rollback to savepoint mark2;

回退已完成。

SQL> select * from cust_info;

        ID NAME
---------- ----------
         1 bb

SQL>  rollback to savepoint mark3;
 rollback to savepoint mark3
*
第 1 行出現錯誤:
ORA-01086: 從未在此會話中建立儲存點 'MARK3' 或者該儲存點無效
           

上述案例中,從上往下依次設立了mark1、mark2、mark3三個事務點,但是如果回退到mark2,則再想回退到mrak3,是無法回退的。