事務傳播行爲:是指添加事物時的策略
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相似的操做。
spring
Spring事務傳播方式
主要控制當前的事務如何傳播到另外的事務中
PROPAGATION_NESTED
若是當前存在事務,則在嵌套事務內執行。
若是當前沒有事務,則進行與PROPAGATION_REQUIRED相似的操做。
嵌套事務一個很是重要的概念就是內層事務依賴於外層事務。
外層事務失敗時,會回滾內層事務所作的動做。而內層事務操做失敗並不會引發外層事務的回滾
PROPAGATION_NEVER
以非事務方式執行,若是當前存在事務,則拋出異常。
PROPAGATION_NOT_SUPPORTED
以非事務方式執行操做,若是當前存在事務,就把當前事務掛起
PROPAGATION_REQUIRED
支持當前事務,若是當前沒有事務,就新建一個事務。這是最多見的選擇(默認)
PROPAGATION_REQUIREDS_NEW
新建事務,若是當前存在事務,把當前事務掛起。
PROPAGATION_SUPPORTS
支持當前事務,若是當前沒有事務,就以非事務方式執行。
PROPAGATION_MANDATORY
支持當前事務,若是當前沒有事務,就拋出異常。
Spring事務隔離級別:
主要定義事務與事務之間在數據庫讀寫方面的控制範圍
主要解決髒讀、不可重複讀、虛讀三個問題
ISOLATION_DEFAULT 默認級別
ISOLATION_READ_UNCOMMITED
事務最低的隔離級別,充許別外一個事務能夠看到這個事務未提交的數據,
會產生髒讀,不可重複讀和幻像讀
ISOLATION_COMMITED
保證一個事務修改的數據提交後才能被另一個事務讀取,能夠避免髒讀出現,
可是可能會出現不可重複讀和幻像讀
ISOLATION_REPEATABLE_READ
保證一個事務不能讀取另外一個事務未提交的數據外能夠防止髒讀,不可重複讀
可是可能出現幻像讀
ISOLATION_SERIALIZABLE
花費最高代價可是最可靠的事務隔離級別。
事務被處理爲順序執行。除了防止髒讀,不可重複讀外,還避免了幻像讀
Spring中的事務管理方式:
編程式和聲明式(常用)
注意事項:
1. 事務邊界設置在service層
2. 須要使用SessionFactory.getCurrentSession
(hibernate3.6)不須要配置Session上下文hibernate.current_session_context_class
3. Spring默認經過捕獲運行時異常實現事務回滾,
非運行期異常不會觸發rollback
能夠經過配置rollback-for 指定異常類
事務中不要catch異常,不然spring放棄事務管理s數據庫