事務
基本概念
概念:一個或者多個DML語言組成
特點:要麼都成功,要麼都失敗
事務的隔離性:多個客戶端同時操作數據庫的時候,要隔離它們的操作,
否則出現:髒讀 不可重復讀 幻讀
Oracle默認情況下,事務是打開的
commit案例:
SQL> create table t1(tid int,tname varchar2(20));
表已創建。
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BONUS TABLE
DEPT TABLE
EMP TABLE
EMP10 TABLE
SALGRADE TABLE
T1 TABLE
已選擇6行。
SQL> insert into t1(tid,tname) values(1,'aaaaa');
已創建 1 行。
SQL> select * from t1;
TID TNAME
---------- --------------------
1 aaaaa
SQL> commit;
提交完成。
SQL> select * from t1;
TID TNAME
---------- --------------------
1 aaaaa
SQL> rollback;
回退已完成。
SQL> select * from t1;
TID TNAME
---------- --------------------
1 aaaaa
SQL>
rollback案例:
SQL> select * from t1;
TID TNAME
---------- --------------------
1 aaaaa
SQL> insert into t1(tid,tname) values(2,'bbb');
已創建 1 行。
SQL> select * from t1;
TID TNAME
---------- --------------------
1 aaaaa
2 bbb
SQL> rollback;
回退已完成。
SQL> select * from t1;
TID TNAME
---------- --------------------
1 aaaaa
SQL>
Oracle中的事務生命周期
1.事務的起始標志 DML語言(oracle默認事務是打開的)
2.事務的結束標志
提交
顯式提交commit
隱式提交
執行DDL語句
Eg:執行create table的時候還有1個隱式的功能
提交之前沒有提交的DML語句(insert update)
正常退出
回滾
顯式rollback
隱式:掉電/宕機/非正常退出,這幾者等價於系統出錯了
4 保存點savepoint
案例:
SQL> select * from t1;
TID TNAME
---------- --------------------
1 aaaaa
SQL> insert into t1(tid,tname) values(2,'bbb');
已創建 1 行。
SQL> select * from t1;
TID TNAME
---------- --------------------
1 aaaaa
2 bbb
SQL> rollback;
回退已完成。
SQL> select * from t1;
TID TNAME
---------- --------------------
1 aaaaa
SQL>
總結:最後一條insert語句沒有插入進去,回滾到了指定的保存點
數據庫的隔離級別
對於同時運行的多個事務,當這些事務訪問數據庫中相同的數據時,如果沒有采取必要的隔離機制,就會導致各種並發問題
髒讀:對於兩個事務T1,T2,T1讀取了已經被T2更新但還沒有被提交的字段之後,若T2回滾。T1讀取的內容就是臨時且無效的。
不可重復讀:對於兩個事物T1,T2,T1讀取了一個字段,然後T2更新了該字段,之後T1再次讀取同一個字段,值就不同了。
幻讀:對於兩個事務T1,T2,T1從一個表中讀取了一個字段,然後T2在該表中插入了一些新的行。之後,如果T1再次讀取同一個表,就會多出幾行。
數據庫事務的隔離性:數據庫系統必須具有隔離並發運行多個事務的能力,使它們不會相互影響,避免各種並發問題。
一個事務與其他事務隔離的程度稱為隔離級別. 數據庫規定了多種事務隔離級別, 不同隔離級別對應不同的干擾程度, 隔離級別越高, 數據一致性就越好, 但並發性越弱
數據庫提供4中事務隔離級別:sql99
Oracle 支持的 2 種事務隔離級別:READ COMMITED, SERIALIZABLE. Oracle 默認的事務隔離級別為: READ COMMITED
另外還支持一種隔離級別:read-only
Mysql 支持 4 中事務隔離級別. Mysql 默認的事務隔離級別為: REPEATABLE READ