目錄
- 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,是無法回退的。