**Web開發中對數據的操作經常需要結合事物的知識,由於事務的知識點比較零散,在此做一個總結,方便以後查找。
1.什麼是事務
答:事物是指邏輯上的一組操作(insert,update,delete),組成這組操作的各個單元,要麼全部成功要麼全部失敗。
2.mysql中的事物管理
a)start transaction —- 開啓一個事務。以後的sql都在一個事務中。更改的內容不會自動提交。
rollback —事務的回滾—同時失敗的情況。–事務結束,並且全部失敗,數據回覆到開始之前的狀態
commit —–事務的提交—-同時成功—事務結束。全部成功。
3.jdbc中事務的管理
一旦數據commit之後,永久更改了。不能回滾了。
4. 事務的特性 ACID
事務:一組操作。
原子性(Atomicity)
原子性是指事務是一個不可分割的工作單位(最小的一個整體),事務中的操作要麼都發生,要麼都不發生。
一組操作時一個整體。不能分割。
一致性(Consistency)
事務前後數據的完整性必須保持一致。
一致性和原子性相關。只有都成功或者,都失敗(原子性) ,就可以保證事務的一致性。
事務的前後的內容一直。
轉賬: a 1000 b 1000 a給b轉100;
轉賬之前 a和b的總額 2000
轉賬之後 也要2000;
部門,員工。 每個部門裏面都有人。
解散一個部門
刪除人。
刪出部門
如果都成功。每個部門都有人。
如果都失敗。每個部門都有人
隔離性(Isolation)
事務的隔離性是指多個用戶併發訪問數據庫時,一個用戶的事務不能被其它用戶的事務所幹擾,多個併發事務之間數據要相互隔離。
多個事務是獨立存在的。多個事物不能夠相互干擾。
a –b—事務A
c-d—事務B
如果A失敗了。不能夠影響B
持久性(Durability)
持久性是指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來即使數據庫發生故障也不應該對其有任何影響。
a-100
b+100
提交
此時a永遠少100
b永遠的多了100
a – 100 a 900
b+100 b 1100
commit;
a -100 a 800
b+100 b 1200
rollback : a 900 b 1100
rollback—異常。對上述沒有任何影響了。
5.事務的隔離級別
a)髒讀:是指一個事物讀取了另外一個事物未提交的數據,後果比較嚴!!
b)不可重複讀:在同一個事務中讀出來的結果,數據上面有出入
c)虛度(幻讀):在同一個事物中取出來的數據條數有出入
6.數據庫的隔離級別
Serializable:可避免髒讀、不可重複讀、虛讀情況的發生。(串行化)
Repeatable read:可避免髒讀、不可重複讀情況的發生。(可重複讀)不可以避免虛讀
Read committed:可避免髒讀情況發生(讀已提交,避免不了虛讀以及不可重複讀)
Read uncommitted:最低級別,以上情況均無法保證。(讀未提交)
設置事務的隔離級別
set session transaction isolation level 設置事務隔離級別
select @@tx_isolation 查詢當前事務隔離級別
7.隔離級別的性能問題
性能比較
Serializable 性能最差:事務一個一個執行的。排隊。
Serializable < Repeatable read < Read committed < Read uncommitted
安全性比較
Serializable 安全性最好:所有問題避免掉。
Serializable > Repeatable read > Read committed > Read uncommitted
Read uncommitted 避免不了最重問題,髒讀。
Serializable:性能太差。
mysql (默認)– Repeatable read;
oracle(默認) – Read committed;