事務(transaction)是由一些列操做序列構成的執行單元,這些單元要麼都作,要麼不作,是一個不可分割的工做單元。數據庫
事務的四種特性:原子性、一致性、分離性、持久性。併發
原子性:指的是事物中包含的全部操做要麼全作,要麼全不作。spa
一致性:在事物開始之前,數據庫處於一致性的狀態,事物結束後,數據庫也必須處於一致性的狀態。事務
分離性:指併發的事務是相互隔離的。即一個事務內部的操做及正在操做的數據必須封鎖起來,不被其它企圖進行修改的事務看到。io
持久性:持久性意味着當系統或介質發生故障時,確保已提交事務的更新不能丟失。即一旦一個事務提交,DBMS保證它對數據庫中數據的改變應該是永久性的,即對已提交事務的更新能恢復。持久性經過數據庫備份和恢復來保證。class
事務處理有兩種:1.數據庫事務 2.Spring事務(咱們通常都用Spring處理事務)date
數據庫事務級別有3中:分別是幻讀、不可重複讀和髒讀。數據
幻讀(讀取時,插入):事務T1進行查詢操做返回了一個結果集,事務T2此時進行了insert操做,剛好知足事務T1的要求,此時T1並查詢一遍,返回的結果集和第一次返回的結果集不一樣。查詢
不可重複讀(讀取時,有更新):事務T1進行查詢操做返回了一個結果集,事務T2此時進行了update操做,事務T1再查詢一遍,兩個返回的結果集不一致。di
髒讀(更新後讀取):事務T1進行了insert/update操做,未提交。事務T2進行查詢返回了一個結果集,此時T1進行了回滾,T2讀到的其實就是無效的髒數據了。
數據庫事務隔離級別有如下四種:
READ UNCOMMITTED 幻想讀、不可重複讀和髒讀都容許。
READ COMMITTED 容許幻想讀、不可重複讀,不容許髒讀
REPEATABLE READ 容許幻想讀,不容許不可重複讀和髒讀
SERIALIZABLE 幻想讀、不可重複讀和髒讀都不容許
OracleOracle不支持髒讀,因此數據庫支持READ COMMITTED 和 SERIALIZABLE這兩種事務隔離級別。
SQL標準所定義的默認事務隔離級別是SERIALIZABLE,可是Oracle 默認使用的是READ COMMITTED,MySql的默承認重複讀取(REPEATABLE READ);
設置隔離級別使用 SET TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]