1、spring事務失效的幾種情況?
- 自己new的對象(非spring定義的bean),或者同一個類的方法調用(this.調用,未使用動態代理),這兩種方式都會繞過spring的aop
- 對應的數據庫不支持事務
- 事務標記@Transational加在了非public方法上,spring aop的特性
- 拋出的是非runtimeException異常,spring aop的特性
- 事務標記的方法內部捕獲了異常,未重新拋出
- 開啟的子線程中
2、向redis中快速寫入百萬數據?
- 使用管道技術(批量發送redis命令,介紹網絡通信開銷)
- 拆分數據塊并使用多線程,將要插入的數據分塊,有多個線程并發插入
- 合理設置redis內存,避免redis內存過小,導致頻繁的內存回收和分配
- 考慮暫時性暫停redis的持久化
3、一個事務方法中,有鎖需要注意什么
- 注意鎖粒度和鎖類型的選取(共享和排他)
- 加鎖和解鎖時機
- 確保在事務開始后立即獲取必要的鎖,并在事務提交或回滾后立即釋放鎖。
- 避免在鎖持有期間進行不必要的操作,以減少鎖持有時間。
- 死鎖預防
- 設計合理的加鎖順序,避免循環等待條件。
- 使用數據庫提供的死鎖檢測和超時機制,或者在應用層面實現死鎖檢測和解決策略。
- 異常處理:
- 確保在捕獲異常時能夠正確釋放持有的鎖,避免資源泄露。
- 在事務回滾時,確保所有鎖都被釋放。