事務的四大特性
1.原子性
2.一致性
3.隔離性
4.持久性
四種事務隔離級別
1.未提交讀
2.已提交讀
3.可重復讀
4.可串行化
事務隔離要解決三個問題
1.臟讀,讀取到了未提交事務的數據,比如未提交讀就可能會產生這種數據
2.不可重復讀,在同一個事務里兩次讀取的數據不一樣,因為在兩次讀取的過程中,另一個事務提交改變了該值(update操作)。未提交讀,已提交讀又稱為不可重復讀,會產生這種情況。
3.幻讀,與不可重復讀類似,幻讀是兩次查詢的行個數不一樣(針對的是insert操作)。幻讀針對的是多行,不可重復讀針對的是一行或者一個數據。事務隔離級別前三種都可能會產生這種情況。
可串行化三種情況都不會產生,但是效率比較低,他是一個事務執行完畢,才能執行下一個事務。
spring當中設置事務隔離級別@Transcational(Isolation = 'ISOLATION_READ_UNCOMMITTED')類似這種。
事務與mysql鎖之間的關系
mysql有三種鎖,表鎖(開銷小,加鎖快,鎖粒度最大,避免死鎖,鎖沖突概率最高,並發最低),行鎖(開銷大,加鎖慢,鎖粒度最小,會出現死鎖,鎖沖突最低,並發最高),頁鎖(介於表鎖與行鎖之間)
使用表鎖的主要是myisam,memory,csv一些非事務型存儲引擎。
使用行鎖的是innodb這種事務引擎。
未提交讀,鎖住修改的行
可重復讀,
串行化會鎖住整張表
spring的七種傳播級別
spring使用手法 @Transcational(propagation = 'XXX')