1.什麼是事務?
事務就是由一條或多條SQL操作組成的一個不可分割的工作單元。只有當事務中的所有操作都完成後,這個事務纔會被提交;只要有一個操作沒有完成,那麼這個事務就會被回滾。(簡單理解,就是要麼全部執行,要麼全部不執行;)
2. 事務特性
事務有四個特性(ACID)
原子性(A):事務中的所有SQL語句操作是一個不可分割的單元;要麼全部執行,要麼全部不執行。
一致性(C):事務執行前後要使數據保持一直狀態。(例如,A有200元,B有100元,A給B轉賬,轉賬結束後,A和B的資金綜合應該還是300元;數據應該保持一致。)
隔離性(I):一個事務的操作不影響另一個事務的操作,兩個併發執行的事務之間是相互隔離的。
持久性(D):一個事務被提交後,對數據庫中數據的改變是永久的。提交後的其他操作或故障不會對它有影響。
3. 事務的隔離級別
事務有四個隔離級別:讀未提交、讀已提交、可重複讀、序列化。
Read Uncommitted
讀未提交:事務A可以讀取事務B還沒有提交的數據。這就是髒讀。
那麼怎麼解決髒讀呢?這就需要用到讀已提交。
Read Committed
讀已提交:事務A必須等到事務B把數據提交後才能讀取數據。比如,事務A先去讀取數據庫數據,得到一個結果a;與此同時,事務B去數據庫update數據,並且事務A再次讀取數據,這樣的情況下,事務A的讀操作必須等到事務B的update操作提交以後才能執行,這樣就解決了髒讀問題,但此時事務A再去讀取數據庫數據時,會得到一個結果b;在一次事務裏,兩次讀取結果不同,這就是不可重複讀問題。
那麼怎麼解決不可重複讀問題呢?這就需要用到可重複讀。
Repeatable Read
可重複讀:可重複讀就是在事務A開啓讀操作後(事務開啓),不能進行事務B的update操作。但是可以進行事務B的insert操作;舉例,事務A開啓讀操作,得到結果a,這時事務B插入一條數據,事務A再次讀取數據,得到結果b,兩次讀取結果不一樣,給人一種幻覺,這就是幻讀的問題。
那麼如何解決幻讀問題?使用序列化!
Serializable
序列化:序列化就是隻允許事務一個接一個地執行,不允許事務併發執行;序列化可以解決髒讀、不可重複讀、幻讀的問題。但是,序列化是事務的最高隔離級別,效率低下,比較耗數據庫的性能,一般不推薦使用。