天天看點

資料庫事務(ACID)

事務的特性和隔離級别(概念性問題—面試)

1.事務的特性ACID

1)原子性(Atomicity)原子性是指事務是一個不可分割的工作機關,事務中的操作要麼都發生,要麼都不發生。 
2)一緻性(Consistency)一個事務中,事務前後資料的完整性必須保持一緻。
3)隔離性(Isolation)多個事務,事務的隔離性是指多個使用者并發通路資料庫時,一個使用者的	事務不能被其它使用者的事務所幹擾,多個并發事務之間資料要互相隔離。
4)持久性(Durability)持久性是指一個事務一旦被送出,它對資料庫中資料的改變就是永久性的,接下來即使資料庫發生故障也不應該對其有任何影響。
           

2.并發通路問題

如果不考慮隔離性,事務存在3中并發通路問題。

1)髒讀:B事務讀取到了A事務尚未送出的資料   ------  要求B事務要讀取A事務送出的資料
2)不可重複讀:一個事務中 兩次讀取的資料的内容不一緻  ----- 要求的是一個事務中多次讀取時資料是一緻的  --- unpdate
3)幻讀/虛讀:一個事務中 兩次讀取的資料的數量不一緻  ----- 要求在一個事務多次讀取的資料的數量是一緻的 --insert  delete
           

3.事務得隔離級别

1)read uncommitted : 讀取尚未送出的資料 :哪個問題都不能解決
2)read committed:讀取已經送出的資料 :可以解決髒讀 ---- oracle預設的
3)repeatable read:重讀讀取:可以解決髒讀 和 不可重複讀 ---mysql預設的
4)serializable:串行化:可以解決 髒讀 不可重複讀 和 虛讀---相當于鎖表
           

隔離級别的性能:

read uncommitted>read committed>repeatable read>serialazable
           

安全性:

read uncommitted<read committed<repeatable read<serialazable
           

預設的事務:

一條sql語句就是一個事務 預設就開啟事務并送出事務
           

手動事務:

1)顯示的開啟一個事務:start transaction
2)事務送出:commit代表從開啟事務到事務送出 中間的所有的sql都認為有效 	真正的更新資料庫
3)事務的復原:rollback 代表事務的復原 從開啟事務到事務復原 中間的所有的	sql操作都認為無效資料庫沒有被更新
           

4。JDBC事務操作

預設是自動事務:

執行sql語句:executeUpdate()  ---- 每執行一次executeUpdate方法 代表事務自動送出
           

通過JDBC的API手動事務:

開啟事務:conn.setAutoComnmit(false);
送出事務:conn.commit();
復原事務:conn.rollback();
           

注意:控制事務的connnection必須是同一個執行sql的connection與開啟事務的connnection必須是同一個才能對事務進行控制

5.DBUtils事務操作

QueryRunner:

有參構造:

QueryRunner runner = new QueryRunner(DataSource dataSource);

有參構造将資料源(連接配接池)作為參數傳入QueryRunner,QueryRunner會從連接配接池中獲得一個資料庫連接配接資源操作資料庫,是以直接使用無Connection參數的update方法即可操作資料庫
           

無參構造:

QueryRunner runner = new QueryRunner();
無參的構造沒有将資料源(連接配接池)作為參數傳入QueryRunner,那麼我們在使	用QueryRunner對象操作資料庫時要使用有Connection參數的方法
           

6.使用ThreadLocal綁定連接配接資源