思考:
1. 事務是干什么的?
? ? ? ? 2. 事務的特性?
? ? ? ? 3. 事務控制的傳播方式(傳播行為)
? ? ? ? 4. 事務的隔離級別
? ? ? ? 5. 事務是如何實現的?
? ? ? ? 6. 事務的回滾方式
? ? ? ? 7.? 事務失效場景
回答:
1. 事務和鎖,還有版本控制 都是為了保證數據一致性的。
2. 事務都是圍繞著ACID來的(分布式事務CAP),A是原子性,把整個事務看做為一個不可分的原子,必須都對,或者都錯;C是一致性,事務執行前,數據庫處于一致狀態;執行后,即使發生故障,數據庫仍須保持一致性(例如:轉賬前后總金額不變);I是隔離性,事務和事務之間相互隔離,互不干擾;D是持久性,他主要是針對數據庫層面,一旦事務完成,他的CRUD就都保存在數據庫里,被持久化了。
3. Spring 支持多種事務傳播行為,例如:
- PROPAGATION_REQUIRED:如果當前存在事務,則加入該事務;否則新建一個事務。
- PROPAGATION_REQUIRES_NEW:無論當前是否存在事務,都新建事務,并掛起當前事務。
- PROPAGATION_SUPPORTS:支持當前事務,不存在則以非事務方式執行。
- PROPAGATION_MANDATORY:必須存在事務,否則拋出異常。
- PROPAGATION_NEVER:不能存在事務,否則拋出異常。
- PROPAGATION_NESTED:在嵌套事務中執行。
4. 事務的隔離級別相比MySQL數據庫多了一個級別:默認(?DEFAULT)
- DEFAULT:使用數據庫默認的隔離級別。
? ? ? ? MySQL的隔離級別有:可序列化 > 可重復度(幻讀) > 讀已提交(臟讀) > 讀未提交
5.?是采用的AOP方法,@Transaction為標識,每次開啟動態代理(Java的動態代理,JDK),在同一個線程內,多個 DAO 操作可以共享同一個數據庫連接和事務。當事務提交或回滾后,這些資源會被釋放。
6.回滾方式:(我記得好像可以調節隔離級別查看事務的回滾過程【之前嘗試過,現在有點不清晰了】)
- 默認情況下,Spring 只對運行時異常(RuntimeException 及其子類)和 Error 進行回滾。
- 可以通過 rollbackFor 和 noRollbackFor 屬性自定義哪些異常觸發回滾。
7.(鞭策AI給的一份應面回答)
補充:
1.? JDK代理 和 CGLIB代理的區別 :前者靠反射, 后者考繼承,前者主要針對接口類,后者針對非接口,非final的類