什麼是事務?
事務指邏輯上的一組操作,組成這組操作的各個單元,要麼全部成功,要麼全部不成功。
事務的四大特性(ACID)
1、原子性(Atomicity)
原子性指事務是一個不可分割的工作單位,事務中的操作要麼全部成功,要麼全部不成功。
2、一致性(consistency)
事務的前後必須保持一致。
3、隔離性(Isolstion)
事務的隔離性是多個用戶併發訪問數據庫時,數據庫爲每個用戶開啓的事務,不能被其他事務操作的數據所幹擾,多個併發事務之間要相互隔離。
4、持久性(Durability)
持久性是值事務一旦被提交,他對數據庫的改變就是永久性的,接下來即使數據庫發生故障,也不應該對其有任何影響。
事務的隔離級別
(1)髒讀:指一個事務讀取到了另外一個事務未提交的數據
(2)不可重複讀:在一個事務內讀取表中的某一行數據,多次讀取的結果不同(一個事務讀取到了另外一個事務提交的數據)
(3)虛/幻讀:指在一個事務內讀取到了別的事務插入的數據,導致前後讀取不一致
不可重複讀和髒讀的區別:髒讀是讀取前一事務未提交的髒數據,不可重複讀是重新讀取到了前一事務已提交的數據。
serializable(串行化 對應數據庫的級別8):可避免髒讀、不可重複讀,虛讀情況的發生。但效率是最低的
repeatable read(可重複讀 對應數據庫的級別4):可避免髒讀、不可重複讀情況的發生。數據庫默認是4
read committed(讀已提交 對應數據庫的級別2):可避免髒讀情況的發生。
read uncommitted(讀未提交 對應數據庫的級別1):最低級別,以上問題都無法解決。但效率是最快的
什麼是事務的傳播行爲?
事務的傳播行爲用來描述由一個事務傳播行爲修飾的方法被嵌套進另一個方法時的事務如何傳播。
public class Demo {
public void method1(){
method2();
}
@Transactional(Propagation = xxx)
public void method2(){
}
}
代碼中methodA()
方法嵌套調用了methodB()
方法,methodB()
的事務傳播行爲由@Transaction(Propagation=XXX)
設置決定。這裏需要注意的是methodA()
並沒有開啓事務,某一個事務傳播行爲修飾的方法並不是必須要在開啓事務的外圍方法中調用。
Spring中事務的7中傳播行爲
1、PROPAGATION_REQUIRED:如果當前沒有事務,就創建一個新事務,如果當前存在事務,就加入該事務,該設置是最常用的設置。
2、PROPAGATION_SUPPORTS:支持當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就以非事務執行。‘
3、PROPAGATION_MANDATORY:支持當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就拋出異常。
4、PROPAGATION_REQUIRES_NEW:創建新事務,無論當前存不存在事務,都創建新事務。
5、PROPAGATION_NOT_SUPPORTED:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
6、PROPAGATION_NEVER:以非事務方式執行,如果當前存在事務,則拋出異常。
7、PROPAGATION_NESTED:如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。
我們在應用的時候默認:REQUIRED